Android WebViewのよくある質問と処理方法

4453 ワード

現在html 5は急速に発展しており、多くのnative appがウェブページに埋め込まれ、多変的な市場ニーズを適用している.しかしandroidのwebviewのデフォルトでサポートされている機能は非常に弱く、多くの場所でカスタマイズが必要で、私たちが望んでいる効果を達成することができます.またwebviewは異なるバージョンで異なる程度のバグがあります.次はwebviewでよくある質問をまとめます.
1.WebViewのカスタムエラー表示画面:

  /**
  *            ,   View   WebView
  */
  protected void showErrorPage() {
  LinearLayout webParentView = (LinearLayout)mWebView.getParent();
  initErrorPage();
  while (webParentView.getChildCount() > ) {
  webParentView.removeViewAt( );
  }
  LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
  webParentView.addView(mErrorView, , lp);
  mIsErrorPage = true ;
  }
  protected void hideErrorPage() {
  LinearLayout webParentView = (LinearLayout)mWebView.getParent();
  mIsErrorPage = false ;
  while (webParentView.getChildCount() > ) {
  webParentView.removeViewAt( );
  }
  }
  protected void initErrorPage() {
  if (mErrorView == null ) {
  mErrorView = View.inflate( this , R.layout.online_error, null );
  Button button = (Button)mErrorView.findViewById(R.id.online_error_btn_retry);
  button.setOnClickListener( new OnClickListener() {
  public void onClick(View v) {
  mWebView.reload();
  }
  });
  mErrorView.setOnClickListener( null );
  }
  }

2.WebView Cookiesクリーンアップ:

CookieSyncManager.createInstance( this );
  CookieSyncManager.getInstance().startSync();
  CookieManager.getInstance().removeSessionCookie();

3.cacheと履歴を整理する:
 
  
    webView.clearCache( true );
    webView.clearHistory();

4.Web Viewがページの一番下にスクロールされているかどうかを判断します.
getScrollY()メソッドは、現在の表示領域の先端からページの先端までの距離、すなわち現在のコンテンツがスクロールする距離を返す.
getHeight()またはgetBottom()メソッドは、現在のWebViewというコンテナの高さを返します.
getContentHeightはhtml全体の高さを返すが、現在のページ全体の高さに等しくない.WebViewにはスケール機能があるため、現在のページ全体の高さは実際には元のhtmlの高さにスケールを乗じるべきである.したがって、訂正後の結果、正確な判断方法は、
   

 if (WebView.getContentHeight*WebView.getScale() == (webview.getHeight()+WebView.getScrollY())){ //       }

5.URLブロック:Android WebViewはページ内のfragmentジャンプをブロックできません.しかしurlがジャンプすると、またページリフレッシュが起こり、H 5ページの体験がまた低下します.WebViewにJSメソッドを注入するしかありません.6.WebViewの非ハイパーリンク要求(Ajax要求など)の処理:要求ヘッダを追加する必要がある場合があるが、ハイパーリンク以外の要求はshouldOverrindingでブロックしてwebViewを使用することはできない.loadUrl(String url,HashMap headers)メソッドによるリクエストヘッダの追加は、onWebViewResourceメソッドで対応するリクエストをブロックするなど、urlに特別なタグ/プロトコルを追加し、追加するリクエストヘッダをget形式でshouldInterceptRequest()メソッドでurl末尾のshouldInterceptRequest()メソッドでget形式でブロックする必要があります.例えばJSのロード、画像、Ajaxリクエストなど

Ex:
  @SuppressLint ( "NewApi" )
  @Override
  public WebResourceResponse shouldInterceptRequest(WebView view,String url) {
  //     ( Ajax)           ,    url  ,      imei    
  String ajaxUrl = url;
  //    :req=ajax
  if (url.contains( "req=ajax" )) {
  ajaxUrl += "&imei=" + imei;
  }
  return super .shouldInterceptRequest(view, ajaxUrl);
  }

7.ページに画像を先に表示します.

@Override
  public void onLoadResource(WebView view, String url) {
  mEventListener.onWebViewEvent(CustomWebView. this , OnWebViewEventListener.EVENT_ON_LOAD_RESOURCE, url);
  if (url.indexOf( ".jpg" ) > ) {
  hideProgress(); //          
  mEventListener.onWebViewEvent(CustomWebView. this , OnWebViewEventListener.EVENT_ON_HIDE_PROGRESS, view.getUrl());
  }
  super .onLoadResource(view, url);
  }

8.Webviewが長くなるとシステムのコピーコントロールが呼び出されるので、長押しイベントをブロックします.

mWebView.setOnLongClickListener( new OnLongClickListener() {
  @Override
  public boolean onLongClick(View v) {
  return true ;
  }
  });

9.WebViewでflashサポートを追加するには:

 String temp = " 
" ; String mimeType = "text/html" ; String encoding = "utf-8" ; web.loadDataWithBaseURL( "null" , temp, mimeType, encoding, "" );

以上の内容は、Android WebViewのよくある問題と処理案についてすべて述べたもので、お気に入りください.