私のアプリケーションでは、_ [〜#〜] epublib [〜#〜] を使用してwebview
にepub HTMLファイルを表示しています。私の問題は、epubリーダーにブックマーク機能を使用したいことです。そのために、epubのHTMLファイルからページを表示しているwebview
からテキストをフェッチし、そのテキストをブックマークアクティビティで使用して、ユーザーがブックマークした内容をユーザーに表示します。どうすればこれを達成できますか?
Webviewからプレーンテキストコンテンツを取得することはかなり困難です。基本的に、Androidクラスは提供しませんが、javascriptは提供します、およびAndroidは、JavaScriptがコードに情報を返す方法を提供します。
詳細に入る前に、html構造が単純な場合、データを手動で解析する方がよいことに注意してください。
そうは言っても、ここではあなたがすることです:
明確にするために、以下の実用的な(ただし非常に大まかな)コード例を掲載します。上部にWebビューを表示し、下部にテキストベースのコンテンツを含むテキストビューを表示します。
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");
}
}
次のmain.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」を調べたい
上記のソリューションでは、webViewのすべてのテキストを返すinnerTextプロパティを使用してテキストを提供しています。以下に提案する解決策は、画面上の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つの文字列が必要になります。 1つはjavascriptメソッドをロードし、もう1つはそれを呼び出します。
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つのJavaScriptをロードする必要があります。
webView.loadUrl("javascript:"+ javaScriptToExtractText);
//this will load the method.
view.loadUrl("javascript:window.Android.processContent("+javaScriptFunctionCall+");");
//this will call the loaded javascript method.
楽しい。
本からEPUBLIBでテキストを直接フェッチしませんか?
あなたはEPUBLIBの助けを借りてそのHTMLを手に入れましたよね?それをウェブビューにどのように入れましたか?例はありません。