web-dev-qa-db-ja.com

WebViewのカスタムエラーページを編集または作成するにはどうすればよいですか?

特定のWebサイトにアクセスするために使用されるWebViewレイアウトを作成しましたが、ハンドセットにネットワークがない場合は、カスタムの "Webページは利用できません"リソースを編集または作成すると便利です。接続またはページがタイムアウトします。携帯電話が機内モードのときにアプリ "Wikidroid"を開くと、「- 記事は利用できません "標準の代わりにエラーページAndroid" Webページは利用できません "エラーページ。

私はインターネットで高低を検索しましたが、この要求に対処するオンラインリソースを思いつきませんでした。ありとあらゆる助けに感謝します。前もって感謝します。

17
Sid 6x

デバイスにネットワーク接続があるかどうかを判断するには、許可_<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />_を要求してから、次のコードで確認できます。まず、これらの変数をクラス変数として定義します。

_private Context c;
private boolean isConnected = true;
_

onCreate()メソッドで_c = this;_を初期化します

次に、接続を確認します。

_ConnectivityManager connectivityManager = (ConnectivityManager)
    c.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
    NetworkInfo ni = connectivityManager.getActiveNetworkInfo();
    if (ni.getState() != NetworkInfo.State.CONNECTED) {
        // record the fact that there is not connection
        isConnected = false;
    }
}
_

次に、WebViewの要求を傍受するために、次のようなことを行うことができます。これを使用する場合は、エラーメッセージをカスタマイズして、onReceivedErrorメソッドで使用できる情報の一部を含めることをお勧めします。

_final String offlineMessageHtml = "DEFINE THIS";
final String timeoutMessageHtml = "DEFINE THIS";

WebView browser = (WebView) findViewById(R.id.webview);
browser.setNetworkAvailable(isConnected);
browser.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (isConnected) {
            // return false to let the WebView handle the URL
            return false;
        } else {
            // show the proper "not connected" message
            view.loadData(offlineMessageHtml, "text/html", "utf-8");
            // return true if the Host application wants to leave the current 
            // WebView and handle the url itself
            return true;
        }
    }
    @Override
    public void onReceivedError (WebView view, int errorCode, 
        String description, String failingUrl) {
        if (errorCode == ERROR_TIMEOUT) {
            view.stopLoading();  // may not be needed
            view.loadData(timeoutMessageHtml, "text/html", "utf-8");
        }
    }
});
_
20
Brian

マルコW.は正しいです。

myWebView.setWebViewClient(new WebViewClient() {
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        myWebView.loadUrl("file:///Android_asset/custom_url_error.htm");

    }
});
10
Cain

上記のすべてのソリューションを使用してみましたが、どれも機能していません。私のコードを少しひねって、解決策を得ました:

package com.samnjor.tipsmaster;

import Android.content.Context; import Android.graphics.Bitmap;
import Android.net.ConnectivityManager; import
Android.net.NetworkInfo; import
Android.support.v7.app.AppCompatActivity; import Android.os.Bundle;
import Android.view.View; import Android.webkit.WebSettings; import
Android.webkit.WebView; import Android.webkit.WebViewClient; import
Android.widget.ProgressBar; import Android.widget.TextView;

import com.google.Android.gms.ads.AdListener; import
com.google.Android.gms.ads.AdRequest; import
com.google.Android.gms.ads.InterstitialAd;

public class TodayTips extends AppCompatActivity {
    String ShowOrHideWebViewInitialUse = "show";
    private WebView webview ;
    private ProgressBar spinner;
    private String TAG = TodayTips.class.getSimpleName();
    InterstitialAd mInterstitialAd;
    final String noconnectionHtml = "Failed to connect ot the internet";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_today_tips);
        mInterstitialAd = new InterstitialAd(this);

        // set the ad unit ID
        mInterstitialAd.setAdUnitId(getString(R.string.adbig));

        AdRequest adRequest = new AdRequest.Builder()
                .build();

        // Load ads into Interstitial Ads
        mInterstitialAd.loadAd(adRequest);

        mInterstitialAd.setAdListener(new AdListener() {
            public void onAdLoaded() {
                showInterstitial();
            }
        });
    }

    private void showInterstitial() {
        if (mInterstitialAd.isLoaded()) {
            mInterstitialAd.show();
        }

        webview =(WebView)findViewById(R.id.webView);
        spinner = (ProgressBar)findViewById(R.id.progressBar1);
        webview.setWebViewClient(new CustomWebViewClient());

        webview.getSettings().setJavaScriptEnabled(true);
        webview.getSettings().setDomStorageEnabled(true);
        webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER);

        if(haveNetworkConnection()){
            webview.loadUrl("http://you domain here");
        } else {


            webview.loadData(noconnectionHtml, "text/html", "utf-8"); //
        }
    }
    private boolean haveNetworkConnection() {
        boolean haveConnectedWifi = false;
        boolean haveConnectedMobile = false;

        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();

        for (NetworkInfo ni : netInfo) {
            if (ni.getTypeName().equalsIgnoreCase("WIFI"))
                if (ni.isConnected())
                    haveConnectedWifi = true;
            if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
                if (ni.isConnected())
                    haveConnectedMobile = true;
        }
        return haveConnectedWifi || haveConnectedMobile;

    }

    // This allows for a splash screen
    // (and hide elements once the page loads)
    private class CustomWebViewClient extends WebViewClient {

        @Override
        public void onPageStarted(WebView webview, String url, Bitmap favicon) {

            // only make it invisible the FIRST time the app is run
            if (ShowOrHideWebViewInitialUse.equals("show")) {
                webview.setVisibility(webview.INVISIBLE);
            }
        }

        @Override
        public void onPageFinished(WebView view, String url) {

            ShowOrHideWebViewInitialUse = "hide";
            spinner.setVisibility(View.GONE);

            view.setVisibility(webview.VISIBLE);
            super.onPageFinished(view, url);

        }
    }`` }
0
Samnjor