Android原生WebViewとJavaScriptはインタラクティブです.
5775 ワード
現在の純原生アプリは珍しいです.ほとんどは原生の中に埋め込まれているウェブページのhybirdアプリです.あるいは直接React Nativeを使って開発します.元の生Appでは、埋め込まれたウェブサイトの原生とJavaScriptの相互作用はほとんど避けられません.結局、自分のアプリケーションにウェブページを埋め込むのは、ブラウザとしてだけではありません.AndroidではウェブページをロードするコントロールはWebViewであるため、JavaScriptとの対話も同様にWebViewで実現しなければならない.
関連クラスと主要な方法
ウェストビュー
低いバージョンと高いバージョンのAndroidシステムではWebViewは異なるカーネルを採用しており、Android 4.4以降はそのままChromeのカーネルを使用している.常用方法:
WebSettingは、WebViewのための構成と管理を提供する抽象的なクラスであり、webView.get Settings()の方法によってインスタンスを取得する.常用方法:
WebView Cientは主にWebViewのために要求された各種状態イベントを処理するために用いられます.常用方法:
補助WebViewはJavaScriptダイアログを処理して、進捗、ウェブアイコンなどをロードします.常用方法:
前の理解を通じて、WebViewと彼の補助類のいくつかの基本的な方法は分かりました.次にWebViewの使い方とWebViewの使い方、AndroidソースコードとJavaScriptコードの相互作用を見てみます.
JS呼び出し元の方法
JSはソースのメソッドを呼び出す時に、この方法に@Javascript Interfaceの注釈を加えなければならない.我々はカテゴリまたはインターフェースを定義して、JS呼び出しのための方法を単独で保存することができます.ここではインターフェースを例にしています.インターフェースでは、JS呼び出しに提供するためのgetUrl(String url)方法が提供され、Stringタイプの値をソースに渡す方法が提供される.
パンダの目のPanderEyeでは、知乎日報と網易新聞のAPIを使っていますので、HTML bodyデータは自分達でHTMLのシェルを追加して、ソース生に必要なJavaScarpitコードをロードして、私達の機能を実現します.JSをロードして直接webView.load()で完全なJSコードをロードしてもいいです.自分の加えたheadノードでJSファイルを導入してからwebViewで直接loadします.PandEyeでは第二の方法があります.
enter description here
イメージClick.jsの内容は以下の通りです.
Chromeを使ってWebViewをデバッグします.
WebViewのJavaScriptコードのデバッグはAndroid Studioをそのまま使うのはしょうがないです.HTMLページをどうやってデバッグしますか?答えはChromeブラウザでデバッグします. USBオプションは開いています. Chromeブラウザでアドレスを開く:chrome://inspect またはabout:inspectはデバッグするWebViewを開いて、次のようなインターフェースが見られます.
InspectPage
対応ページのinspectをクリックしてデバッグページに入ることができます.
DebugPage
次の中には前端ページのようにWebViewの内容を調整できます.
最後に
コードの詳細はPandenEyeをご覧ください.
関連クラスと主要な方法
ウェストビュー
低いバージョンと高いバージョンのAndroidシステムではWebViewは異なるカーネルを採用しており、Android 4.4以降はそのままChromeのカーネルを使用している.常用方法:
// url
webView.loadUrl(String url);
// HTML , loadData() data %,#,\,? ,
webView.loadData(String data,String mimeType,String encoding);
webView.loadDataWithBaseUrl(String baseUrl,String mimeType,String encoding,String historyUrl);
// webView ,
webView.onResume();
// webView ,
// pause WebView , JavaScript
webView.onPause();
// WebView layout、parsing、JavaScriptTimers CPU ( )
webView.pauseTimers();
// pauseTimers
webView.resumeTimers();
// WebView WebView
parentLayout.removeView(webView);
webView.destroy();
// ( , )
webView.canGoBack();
//
webView.goBack();
//
webView.canGoForward();
//
webView.goForward();
// steps ( , )
webView.goBackOrForward(int steps);
WebSettingWebSettingは、WebViewのための構成と管理を提供する抽象的なクラスであり、webView.get Settings()の方法によってインスタンスを取得する.常用方法:
// webView JavaScript ( JS true)
webSettings.setJavaScriptEnabled(true);
// JS (function window.open())
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
// webView
webSettings.setPluginsEnable(true);
//
// ,( )
webSettings.setUseWideViewPort(true); // webView
webSettings.setLoadWithOverviewMode(true); // ( PC )
// ,
webSettings.setSupportZoom(true);
//
webSettings.setBuiltInZoomControls(true);
//
webSettings.setDisplayZoomControls(true);
WebView CientWebView Cientは主にWebViewのために要求された各種状態イベントを処理するために用いられます.常用方法:
//
onPageStarted(WebView view, String url, Bitmap favicon);
//
onPageFinished(WebView view, String url);
// ,
onLoadResource(WebView view, String url);
// 404
onReceivedError(WebView view, WebResourceRequest request, WebResourceError error);
webViewデフォルトではhttps要求をロードしません.ページに空白が表示されます.httpsページをロードするには以下のような設定が必要です.webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); //
// handler.cancel(); // ,
// handler.handleMessage(null); //
}
});
WebChromeCient補助WebViewはJavaScriptダイアログを処理して、進捗、ウェブアイコンなどをロードします.常用方法:
//
onProgressChanged(WebView view, int newProgress);
// Title
onReceivedTitle(WebView view, String title);
//
onReceivedIcon(WebView view, Bitmap icon);
WebViewの使用前の理解を通じて、WebViewと彼の補助類のいくつかの基本的な方法は分かりました.次にWebViewの使い方とWebViewの使い方、AndroidソースコードとJavaScriptコードの相互作用を見てみます.
JS呼び出し元の方法
JSはソースのメソッドを呼び出す時に、この方法に@Javascript Interfaceの注釈を加えなければならない.我々はカテゴリまたはインターフェースを定義して、JS呼び出しのための方法を単独で保存することができます.ここではインターフェースを例にしています.インターフェースでは、JS呼び出しに提供するためのgetUrl(String url)方法が提供され、Stringタイプの値をソースに渡す方法が提供される.
/**
* Created by PandaQ on 2017/3/22.
* JS
* ,
*/
public interface JavaScriptFunction {
void getUrl(String string);
}
// PandaEye html Activity
webView.addJavascriptInterface(new JavaScriptFunction() {
@Override
@JavascriptInterface // getUrl() JS
public void getUrl(String imageUrl) {
LogWritter.LogStr(imageUrl);
Intent intent = new Intent();
intent.putExtra("imageUrls", mImageUrls);
intent.putExtra("curImageUrl", imageUrl);
intent.setClass(ZhihuStoryInfoActivity.this, PhotoViewActivity.class);
startActivity(intent);
}
}, "JavaScriptFunction");
// HTML JS
function(){
window.JavaScriptFunction.getUrl(this.src);
}
原生コールJSパンダの目のPanderEyeでは、知乎日報と網易新聞のAPIを使っていますので、HTML bodyデータは自分達でHTMLのシェルを追加して、ソース生に必要なJavaScarpitコードをロードして、私達の機能を実現します.JSをロードして直接webView.load()で完全なJSコードをロードしてもいいです.自分の加えたheadノードでJSファイルを導入してからwebViewで直接loadします.PandEyeでは第二の方法があります.
enter description here
イメージClick.jsの内容は以下の通りです.
function initClick()
{
var objects = document.getElementsByTagName("img");
for(var i=0;i
その後、WebChromeCientでロードの進捗が100%に達したら、JSファイルのinitClick()を呼び出す方法で、各ピクチャにクリックイベントを設定します. /**
*
*
* @param webView WebView
*/
private void addImageClickListener(WebView webView) {
webView.loadUrl("javascript:(initClick())()");
}
直接JSをロードしてinitClick()をJSコードで置き換えればいいです.Chromeを使ってWebViewをデバッグします.
WebViewのJavaScriptコードのデバッグはAndroid Studioをそのまま使うのはしょうがないです.HTMLページをどうやってデバッグしますか?答えはChromeブラウザでデバッグします.
InspectPage
対応ページのinspectをクリックしてデバッグページに入ることができます.
DebugPage
次の中には前端ページのようにWebViewの内容を調整できます.
最後に
コードの詳細はPandenEyeをご覧ください.