如何在Android Webview的自定义错误页面中添加重试按钮?

时间:2018-11-30 11:15:29

标签: android webview

我已经为该网站创建了Android Webview。 未连接互联网时,我已经创建了自定义错误页面。 文件加载正常。 如果未连接互联网,则错误页面正在加载。 有什么方法可以在自定义错误页面中添加重试按钮,以便一旦连接了互联网并且用户单击重试按钮然后再次加载Webview即可? 现在,我必须退出应用程序,然后再次连接互联网后就必须再次打开该应用程序。 我要在自定义错误页面上具有重试按钮,而不退出应用程序,而是要在自定义错误页面上设置重试按钮,这样才能加载不退出应用程序的Webview。 还是一旦连接互联网就可以自动加载Webview?

MainActivity.java是

package com.flyingcolorz.flyingcolorz;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.app.Activity;
import android.view.KeyEvent;
import android.content.DialogInterface;
import android.app.AlertDialog;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.ProgressBar;
import android.webkit.WebResourceRequest;
import android.content.Intent;
import android.net.Uri;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String url = "https://google.com/";
    setContentView(R.layout.activity_main);
    final WebView myWebView = (WebView) findViewById(R.id.webview);
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    myWebView.loadUrl(url);
    //myWebView.setWebViewClient(new WebViewClient());
    // Get Connectivity Manager class object from Systems Service
    //ConnectivityManager cm = (ConnectivityManager)  getSystemService(Context.CONNECTIVITY_SERVICE);
    // Get Network Info from connectivity Manager
    //NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    // if no network is available networkInfo will be null
    // otherwise check if we are connected
    // if (networkInfo == null) {
    myWebView.setWebViewClient(new WebViewClient() {
      @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        myWebView.loadUrl("file:///android_asset/error.html");
      }
    });
    // }
  }
  //goto previous page
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    WebView myWebView = (WebView) findViewById(R.id.webview);
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
      switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
          if (myWebView.canGoBack()) {
            myWebView.goBack();
          } else {
            //finish();
            new AlertDialog.Builder(this)
              .setIcon(android.R.drawable.ic_dialog_alert)
              .setTitle("Exit")
              .setMessage("Are you sure you want to exit?")
              .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                  finish();
                }

              })
              .setNegativeButton("No", null)
              .show();
          }
          return true;
      }
    }
    return super.onKeyDown(keyCode, event);
  }
}

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作作为解决方案。

添加具有滑动刷新布局的网络视图。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.vvhvb.hesselfeenstra.vvheerenveenseboys.MainActivity"
tools:showIn="@layout/activity_main">

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipeContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/webView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true" />

</android.support.v4.widget.NestedScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>

并将错误消息显示为“发生了错误!从顶部滑动以重试。”

现在,当用户刷新时,将所需的默认URL加载到Web视图中。

mySwipeRefreshLayout.setOnRefreshListener(
    new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            webview.loadUrl(url);
        }
      }
    );

答案 1 :(得分:0)

您可能必须添加一些连接性触发器,一旦检测到连接性恢复,这些触发器将自动重新加载到原始URL。但是,我不知道是否有可能,或者如何做到这一点。

我遇到了完全相同的问题。这是我的处理方式(我不希望“刷卡刷新”):

我为错误页面(例如ErrorActivity)创建了一个单独的活动,并像加载普通Web视图一样加载了error.html页面。

因此,我将onReceivedError更改为此:

    @Override
    public void onReceivedError(WebView webview, int i, String s, String s1)
    {
        WebView.setVisibility(View.GONE);
        Intent intent = new Intent(MainActivity.this, ErrorActivity.class);
        startActivity(intent);
        finish();
    }

基本上,此代码检测到已收到一些错误,然后隐藏原始的WebView并使用ErrorActivity启动Intent,并完成{{1} }。

然后MainActivity进入我的ErrorActivity页面,告诉用户从error.html重新加载页面。

现在,要创建menu button,我们需要在ErrorActivity中对其进行定义,为其创建一个布局文件,然后加载AndroidManifest.xml

如果您还没有WebView,则必须在menu内创建一个menu文件夹。这种情况下的示例res文件:

menu.xml

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/refresh" android:icon="@drawable/ic_refresh_black_24dp" android:orderInCategory="1" app:showAsAction="always" tools:ignore="AlwaysShowAction" android:title="@string/refresh"/> </menu> 之外的ErrorActivity.java中,添加以下内容:

onCreate

基本上,一旦您按下@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.menu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.refresh: Intent intent = new Intent(ErrorActivity.this, MainActivity.class); startActivity(intent); finish(); break; } return super.onOptionsItemSelected(item); } ,您的应用就会尝试加载Refresh。如果仍然存在某些Internet连接问题,您的MainActivity将再次收到错误消息,并会再次加载MainActivity's WebView。到目前为止,这对我来说是完美的。

这应该做到。

如果您要更改此代码以满足您的需要,请确保更新ID等。

答案 2 :(得分:0)

一名医学系学生在这里,试图解决您的问题。 只需在错误页面(error.html)中添加一个按钮即可。

<a href="https://www.google.com/" ><button>RETRY</button></a>
再见! 是时候来看病人了。