WebViewの使い方
7154 ワード
キークラス WebView WebSettings WebView Cient WebChromeClient WebViewの基本的な使い方: WebViewには他にも2つの方法があり、 mimeType:データタイプ、例えば:text/html. encoding:データ符号化方式base 64またはurl encoding. baseUrl:ページのルートを指定します。 WebViewの設定
WebViewを設定するには、まずWebSettingsオブジェクトを取得する必要があります。WebSettingsオブジェクトは
私たちは自分のWebViewに関する要求を処理したくない場合があります。例えば、ページにメール、電話、メッセージなどのリンクがある場合、ユーザーがクリックした後に第三者のアプリケーションを起動してほしいです。私たち自身のWebView処理ではなく、次のように実現できます。
まず、私は一つのhtml文書を私たちはウェブページのいくつかのリソースをブロックしたい場合、Web View Clientの 画像のロードを禁止する ページの読み込みエラーが発生した場合、 JavaScriptとWebViewの相互作用
Javascriptを呼び出します。
直接呼び出し
WebChromeCientをリロードして呼び出します。
注意上のHtmlコードは、ページ読み込み時にポップアップダイアログがあります。WebViewの設定には
もしこのシャッターが本当に見苦しいと思ったら、私達は次のような方法でカスタムできます。
主に
まずクラスを作ります。次のように。
WebViewミニ開発
もし私達はユーザーがWebViewの中のリンクをクリックしてジャンプしたくないならば、リターンキーを押して直接アプリケーションを退出して、Activityの中で
下記のコードを追加します
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.example.com");
ロードがネットワークページである場合は、ネットワーク権限を申請する必要があります。
追加loadData(String data, String miniType,String edcoding)
とloadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
が「data」しかロードできない場合があり、他のプロトコルのURLがロードできなくなり、ロードされたURLが必ずしも「data」ではない場合には、次の方法が推奨されます。loadData()
は、リソースロケータを統一し、URL
は、リソース識別子を統一する。URIにはURLが含まれていますURI
の一般的な文法URL
。WebViewを設定するには、まずWebSettingsオブジェクトを取得する必要があります。WebSettingsオブジェクトは
scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]
によって獲得されるのではなく、WebViewを作成すると、デフォルトのWebSettingsオブジェクトが得られます。このWebSettingオブジェクトはnew
によって得ることができる。WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
WebViewを通じて一つのページをロードした時、ページのリンクをクリックすると、ダイアログが開きます。どのブラウザを通じて開くかを選択します。もし直接に自分のWebViewで開けたいなら、次のような方法で実現できます。myWebView.setWebViewClient(new WebViewClient());
WebViewリソース要求を遮断する私たちは自分のWebViewに関する要求を処理したくない場合があります。例えば、ページにメール、電話、メッセージなどのリンクがある場合、ユーザーがクリックした後に第三者のアプリケーションを起動してほしいです。私たち自身のWebView処理ではなく、次のように実現できます。
まず、私は一つのhtml文書を
myWebView.getSettings()
ディレクトリの下に置いています。main/assets
ディレクトリの下ではないので注意してください。ウェブページをシミュレートします。html文書は以下の通りです
WebView Test
var new_activity = function(){
android.newActivity();
}
var send_notification = function(){
android.sendNotification();
}
window.onload = function(){
alert("alert from javascript");
}
javaコードにおいてWebView Clientを書き換えるres/
方法は、shouldOverrideUrlLoading(WebView view, String url)
に戻り、この方法を書き換えたことを示し、今回の要求は自分のtrue
で処理されず、第三者アプリケーションを呼び出す。// url 。
String url = "file:///android_asset/index_test.html";
myWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri uri = Uri.parse(url);
if ("mailto".equalsIgnoreCase(uri.getScheme())
||"tel".equalsIgnoreCase(uri.getScheme())
||"sms".equalsIgnoreCase(uri.getScheme())){
// Intent Action 。
Intent intent=new Intent(Intent.ACTION_VIEW, uri);
startActivity( intent);
return true;
}
return false;
}
});
myWebView.loadUrl(url);
追加WebView
方法を書き換える必要がありますが、shouldIntercepterRequest()
を書き換えるのは効果がありません。ウェブページのリソースは「IO」スレッドにロードされているため、shouldOverrideUrlLoading
はメインスレッドで実行され、新しいshouldOverrideUrlLoading
オブジェクト、つまりページが書き換えられてロードされる必要がある場合にのみリロードされます。URL
方法は、shouldIntercepterRequest
スレッド内で動作し、リソース要求をブロックし、他のリソースを返すことができる。IO
webSettings.setLoadsImagesAutomatically(false)
のWebViewClient
方法を書き換えることができる。Javascriptを呼び出します。
直接呼び出し
myWebView.loadUrl("javascript:alert(java to javascript)");
追加的に、onReceivedError()
方法によって、戻り値を伴うjs方法を処理しても良い。WebChromeCientをリロードして呼び出します。
注意上のHtmlコードは、ページ読み込み時にポップアップダイアログがあります。WebViewの設定には
evaluateJavascript
が与えられていますが、WebViewはまだダイアログが表示されません。以下の方法でダイアログが表示されます。myWebView.setWebChromeClient(new WebChromeClient());
setJavaScriptEnabled(true)
とWebChromeClient
は何が違いますか?前者は主にJSを補助し、ページの内容と対話する。後者は主にページローディング中のイベント通知を担当します。もしこのシャッターが本当に見苦しいと思ったら、私達は次のような方法でカスタムできます。
myWebView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();
result.confirm();
return true;
}
});
Javascript呼び出しjava主に
WebViewClient
を通じて、Javascriptにオブジェクトとオブジェクトの名前を注入する。appi 17以下では、addJavascriptInterface(Object object,String name)
すべての方法が注入され、appi 17以上ではpublic
の注釈が付加された方法のみが注入される。まずクラスを作ります。次のように。
public class WebAppInterface {
private Context mContext;
private final static int NOTIFICATION_ID = 1;
public WebAppInterface(Context c) {
mContext = c;
}
// html
@JavascriptInterface
public void newActivity(){
Intent intent = new Intent(mContext,JSActivity.class);
mContext.startActivity(intent);
}
// html
@JavascriptInterface
public void sendNotification(){
Notification notification = new NotificationCompat.Builder(mContext)
.setContentTitle("hello")
.setContentText("this notification is sent by js")
.setSmallIcon(R.drawable.notification_icon)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.build();
NotificationManager manager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(NOTIFICATION_ID,notification);
}
}
このjsインターフェースをWebViewに追加します。myWebView.addJavascriptInterface(new WebAppInterface(mContext),"android");
その後、上記の2つの方法をjsで呼び出すことができます。詳細は上のhtmlファイルを参照してください。WebViewミニ開発
もし私達はユーザーがWebViewの中のリンクをクリックしてジャンプしたくないならば、リターンキーを押して直接アプリケーションを退出して、Activityの中で
@JavascriptInterface
方法を書き換えることができます。@Override
public void onBackPressed() {
if (myWebView.canGoBack()){
myWebView.goBack();
}else {
super.onBackPressed();
}
}
WebViewデバッグテクニック下記のコードを追加します
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.KITKAT && BuildConfig.DEBUG){
myWebView.setWebContentsDebuggingEnabled(true);
}
chromeブラウザにonBackPress
を入力します。