android-получить текст из webview
в моем приложении я показываю HTML-файлы epub в webview
используя в нем могут содержаться.
Моя проблема в том, что я хочу использовать функциональность закладок для моего читателя epub. Для этого я хочу получить текст из webview
который показывает страницу из HTML-файла моего epub, а затем использует этот текст в моей закладке, чтобы показать пользователю, что они закладки.
Как я могу достичь этого?
5 ответов
получение содержимого обычного текста из webview довольно сложно. В принципе, классы android не предлагают его, но javascript делает, и Android предлагает способ для javascript передать информацию обратно в ваш код.
прежде чем я перейду к деталям, обратите внимание, что если ваша структура html проста,возможно, вам лучше просто проанализировать данные вручную.
что сказал, Вот что вы делаете:
- включить в JavaScript
- добавьте свой собственный класс интерфейса javascript, чтобы javascript мог общаться с вашим кодом Android
- зарегистрировать webviewClient, переопределение onPageFinished чтобы вставить немного javascript
- в javascript приобретите элемент.через свойство innerText тега и передайте его в свой интерфейс javascript.
чтобы уточнить, я опубликую работает (но очень грубый) пример кода ниже. Он отображает веб-представление вверху и текстовое представление с текстовым содержимым внизу.
package test.android.webview;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
public class WebviewTest2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView webView = (WebView) findViewById(R.id.webView);
TextView contentView = (TextView) findViewById(R.id.contentView);
/* An instance of this class will be registered as a JavaScript interface */
class MyJavaScriptInterface
{
private TextView contentView;
public MyJavaScriptInterface(TextView aContentView)
{
contentView = aContentView;
}
@SuppressWarnings("unused")
public void processContent(String aContent)
{
final String content = aContent;
contentView.post(new Runnable()
{
public void run()
{
contentView.setText(content);
}
});
}
}
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavaScriptInterface(contentView), "INTERFACE");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url)
{
view.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText);");
}
});
webView.loadUrl("http://shinyhammer.blogspot.com");
}
}
используя следующую основную.XML-код:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="0.5" />
<TextView
android:id="@+id/contentView"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="0.5" />
</LinearLayout>
wvbrowser.evaluateJavascript(
"(function() { return ('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'); })();",
new ValueCallback<String>() {
@Override
public void onReceiveValue(String html) {
Log.d("HTML", html);
// code here
}
});
единственное, что приходит мне на ум в этом случае, это использовать javascript. Быстрый поиск я нашел android.webkit.WebView.addJavascriptInterface
.
вы хотите изучить "addJavascriptInterface", который в конце концов поможет вам решить проблему
решение, приведенное выше, предоставляет текст, используя свойство innerText, которое вернет вам весь текст в webView. Решение, которое я предлагаю ниже поможет вам извлечь текст из видимой части WebView на экране.
Шаг 1: для этого требуется помощь javaScript, поэтому сначала включите javascript.
webView.addJavascriptInterface(new IJavascriptHandler(getActivity().getApplicationContext()), "Android"); //if your class extends a Fragment class
или
view.addJavascriptInterface(new IJavascriptHandler(this), "Android"); //if your class extends Activity.
Шаг 2: Создайте внутренний класс javaInterface.
final class IJavascriptHandler {
Context mContext;
IJavascriptHandler(Context c) {
mContext = c;
}
//API 17 and higher required you to add @JavascriptInterface as mandatory before your method.
@JavascriptInterface
public void processContent(String aContent)
{
//this method will be called from within the javascript method that you will write.
final String content = aContent;
Log.e("The content of the current page is ",content);
}
}
Шаг 3: Теперь вы должны добавить JavaScript-метод. Вы напишете метод в виде строки, а затем загрузите его. Метод возвращает текст на основе предоставленного ему параметра. Итак, вам понадобятся 2 строки. Один загрузит метод javascript, а другой вызовет его.
метод для загрузки метода javascript.
String javaScriptToExtractText = "function getAllTextInColumn(left,top,width,height){"
+ "if(document.caretRangeFromPoint){"
+ "var caretRangeStart = document.caretRangeFromPoint(left, top);"
+ "var caretRangeEnd = document.caretRangeFromPoint(left+width-1, top+height-1);"
+ "} else {"
+ "return null;"
+ "}"
+ "if(caretRangeStart == null || caretRangeEnd == null) return null;"
+ "var range = document.createRange();"
+ "range.setStart(caretRangeStart.startContainer, caretRangeStart.startOffset);"
+ "range.setEnd(caretRangeEnd.endContainer, caretRangeEnd.endOffset);"
+ "return range.toString();};";
метод для вызова вышеуказанной функции.
String javaScriptFunctionCall = "getAllTextInColumn(0,0,100,100)";
//I've provided the parameter here as 0,0 i.e the left and top offset and then 100, 100 as width and height. So, it'll extract the text present in that area.
Шаг 4: Теперь вам нужно загрузить вышеуказанные 2 javascripts.
webView.loadURL("javascript:"+ javaScriptToExtractText);
//this will load the method.
view.loadUrl("javascript:window.Android.processContent("+javaScriptFunctionCall+");");
//this will call the loaded javascript method.
наслаждайтесь.
Почему бы тебе не принести текст в нем могут содержаться из книги напрямую?
вы получили этот html с помощью EPUBLIB, не так ли? Как вы поместили это в webvieuw? Я не вижу примера.