6

我正在将 google docs 中的文档加载到我的 webview 中。我看到的问题是,当用户启动应用程序并且未连接到网络时,会看到以下屏幕:

在此处输入图像描述

现在,如果他连接到网络,在不重新启动应用程序的情况下在 webview 中打开该链接的方法是什么。在 webview 中单击该链接是一种选择,但如果发生这种情况,我可以提供一些更好的用户友好方式在 webview 中重新加载页面吗?

4

3 回答 3

10

您可以在 WebViewClient 中捕获网络错误,并显示自己自定义的布局,如下所示:

       webView.setWebViewClient(new WebViewClient() {

            @Override
            public void onReceivedError(final WebView view, int errorCode, String description,
                    final String failingUrl) {
                //control you layout, show something like a retry button, and 
                //call view.loadUrl(failingUrl) to reload.
                super.onReceivedError(view, errorCode, description, failingUrl);
            }
        });
于 2013-08-14T03:37:25.170 回答
0

首先,“网页不可用”是webviewclient发生错误时抛出的错误页面。设置自定义 webviewclient 并覆盖 onReceiverError 将处理您的 webview 将收到的错误。

webView.setWebViewClient(new WebViewClient() {

      @Override
      public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
      {
         //some codes here that you want to do when webview receives an error
      }
    });

其次,您是否为网络连接正确设置了清单?无论如何只需添加这三个:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

第三,要在不重新启动应用程序的情况下访问链接,您必须:

  1. 将此代码添加到您构建 web 视图的位置

    if(savedInstanceState == null)
    { wv.loadUrl( url here ); }
    
  2. 添加这两个方法:

    @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); wv.saveState(outState); }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState)
    {
        super.onSaveInstanceState(savedInstanceState);
        wv.restoreState(savedInstanceState);
    }
    

第三,在重新加载页面时,我所做的是

  1. 覆盖 onCreateOptionsMenu,并为其创建一个 xml。你可以很容易地谷歌如何做到这一点
  2. 给它充气 getMenuInflater().inflate(R.menu.main, menu);
  3. 覆盖 onOptionsItemSelected 并添加项目,也可以轻松搜索。
于 2013-08-14T04:10:07.913 回答
-1

你可以试试这个:

  1. 创建导航栏

    例如,我正在创建这样的导航栏..

     <?xml version="1.0" encoding="utf-8"?>
     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:orientation="vertical" >
    
    <FrameLayout
     android:id="@+id/wvPlaceHolder"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent" />
    
    
    <RelativeLayout
     android:layout_width="fill_parent"
     android:layout_height="45dp"
     android:layout_alignParentBottom="true"
     android:layout_alignParentLeft="true"
     android:background="@drawable/status_bar" >
    
    <ImageButton
        android:id="@+id/iBback"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:clickable="true"
        android:contentDescription="@string/press_me"
        android:src="@drawable/wg_back" />
    
    <ImageButton
        android:id="@+id/iBrefresh"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/iBback"
        android:layout_centerHorizontal="true"
        android:clickable="true"
        android:contentDescription="@string/press_me"
        android:src="@drawable/wg_refresh" />
    
    <ImageButton
        android:id="@+id/iBforward"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:clickable="true"
        android:contentDescription="@string/press_me"
        android:src="@drawable/wg_forward" />
    </RelativeLayout>
    
    </RelativeLayout>
    
  2. 在 Java 方面,您在初始化和设置 onclickListener 之后为这些图像按钮提供了一些功能。这里我只是展示了它们在听到点击后将执行的操作。

    @Override
    public void onClick(View v) throws NullPointerException{
    
    ConnectivityManager conManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    
    switch (v.getId()) {
    
    case R.id.iBback:
        if(conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
                .getState() == NetworkInfo.State.CONNECTED
                || conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                        .getState() == NetworkInfo.State.CONNECTED)
        {
            if (wv.canGoBack())
                wv.goBack();
        }
        break;
    case R.id.iBforward:
        if(conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
                .getState() == NetworkInfo.State.CONNECTED
                || conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                        .getState() == NetworkInfo.State.CONNECTED)
        {
             if (wv.canGoForward())
                 wv.goForward();
        }
        break;
    case R.id.iBrefresh:
    
        // conManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    
        if (conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
                .getState() == NetworkInfo.State.CONNECTED
                || conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                        .getState() == NetworkInfo.State.CONNECTED) {
            wv.reload();
        } 
        break;
    
    }
    

    很简单:)

于 2013-08-14T04:05:34.473 回答