Android webviewカスタム404エラーページ!

3830 ワード

カスタム404ページ.androidのwebviewコントロールはホームページを読み込むことができます.webviewには二つの方法があります.
WebChromeClientは主に解析を処理して、ウェブページなどのブラウザのすることを誇張して、Javascriptのダイアログを処理することを補助して、ウェブサイトのアイコン、ウェブサイトのtitle、ローディングの進度: onClose Window(WebViewを閉じる) onCreateWindow() onJs Alert(WebViewでalertは弾けないもので、あなたのWebChromeClient処理をカスタマイズしてポップアップする必要があります.) onJs Propt onJs Confirm onProgress Changed onReceivedIcon onReceivedTitle
例えば、プログレスバーを追加して、インターフェースをより友好的にします.
WebView CientはWebViewのために各種の通知、要求イベントを処理するのです.具体的には以下を含みます. 
onLoadResource onPageStart onPageFinish onReceive Error //これは私達が欲しい方法です.onReceivedhttp AuthRequest. 
じゃ、私達がカスタマイズした404インターフェースをロードするには二つが必要です.
コードは以下の通りです
 
 1         webView = (WebView) findViewById(R.id.webv);//     2         webView.getSettings().setJavaScriptEnabled(true); //  js  ,  js   ,    3         webView.getSettings().setSupportMultipleWindows(true); 4          5         webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
 6          7         webView.setWebChromeClient(new MyWebChromeClient() 8             {         
 9                 public void onProgressChanged(WebView view, int progress)//       10                 {11                     activity.setTitle("    ...Loading...");12                     activity.setProgress(progress * 100);13                     if(progress >= 100){14                         new Thread(new Runnable() {15                             @Override16                             public void run() {17                                 Message msg=handler.obtainMessage();//    ,    18                                 msg.what=2;//    19                                 handler.sendMessage(msg);//    !20                             }              
21                         }).start();  
22                         activity.setTitle(R.string.app_name);23                     }24                 }25             }26         );27         28         webView.setWebViewClient(new WebViewClient() {29             public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)    
30             { 
31                 view.stopLoading();32                 view.clearView();33                 Message msg=handler.obtainMessage();//    ,    34                 msg.what=1;//       404  35                 handler.sendMessage(msg);//    !36             }37             public boolean shouldOverrideUrlLoading(WebView view, String url)  
38             {39                 view.loadUrl(url);40                 return true;41                 }42             });43         webView.addJavascriptInterface(this, "javatojs");//  activity   java_js  js   44         webView.loadUrl(URL);45         checkUPPay();//             46     }47     /**48      * handler      49      */50         protected Handler handler = new Handler(){51             public void handleMessage(Message message){52                 switch (message.what) {53                 case 0:54                     myDialog.show();55                     break;56                 case 1:57                     webView.loadUrl(URL404);58                     break;59                 case 2:60                     myDialog.dismiss();61                     break;62                 }63             }64         };
説明:この2つの方法はいずれもシステム内蔵の方法ですが、それでも短いジャンプがあります.ジャンプする瞬間に既存の404ページが見えます.他の文章の分析を理解しましたが、一部の文章はwebviewでページを読み込むのは2つのスレッドを通して行われるので、エラーメッセージを受信した時にもう一つのスレッドが元のページを表示する可能性があります.だからちょっと「フラッシュ」があります.
この方法を使う前に、他のユーザー定義のインターフェースをロードしたいです.例えば、ページが99%以上にロードされた時に、webviewのtitleを検出します.nullまたは「ページが見つからない(違う携帯電話がヒントを与えるかもしれない)」なら、ユーザー定義のエラーインターフェースにジャンプしても、同じく短いフラッシュ元404インターフェースが現れます.
文章の最初の方法を見つけたら、思い切ってこの方法を捨てました.携帯電話の提示が違っていますので、tomcatや他のサーバーが他のエラー情報を返します.これは私も意味測定が必要です.遅くなく、科学的ではありません.
経験には限りがあり、技術が乏しく、ご参考までに.批判の叱正を歓迎する