Как редактировать или создать страницу пользовательских ошибок для WebView?
-
29-09-2019 - |
Вопрос
Я создал макет WebView, который используется для доступа к конкретному веб-сайту, однако было бы полезно редактировать или создать пользовательский «страница не доступна«Ресурс, когда трубка не имеет сетевого подключения или времена страницы. Я знаю, что это возможно потому, что если вы откроете приложение»Wikidroid«В то время как телефон находится в режиме самолета, который вы получаете»Статья недоступна«Страница ошибки вместо стандартного Android»страница не доступна«Страница ошибки.
Я имею поиск высоких и низких в Интернете и не придумал какие-либо онлайн-ресурсы, которые обращаются к этому запросу. Любая и вся помощь очень ценится. Заранее спасибо.
Решение
Чтобы определить, когда устройство имеет сетевое соединение, запросить разрешение <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
queenes, вы могли бы сделать что-то вроде следующего. Если вы используете это, вы, вероятно, захотите настроить сообщения об ошибках, чтобы включить часть информации, доступной в 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");
}
}
});
Другие советы
Marco 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");
}
});
Я пытался использовать все вышеперечисленные решения, но ни один из них не работает. Немного покрутил мой код и получил решение:
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);
}
}`` }