我正在将Google文档中的文档加载到我的webview中。我看到的问题是,当用户启动应用程序但未连接到网络时,请看以下屏幕:
现在,如果他连接到网络,在没有重新启动应用程序的情况下,在webview中打开该链接的方法是什么。单击webview中的该链接是一个选项,但如果发生这种情况,我是否可以提供一些更好的用户友好方式来重新加载webview中的页面?
答案 0 :(得分:9)
您可以在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);
}
});
答案 1 :(得分:0)
首先,"网页不可用"是发生错误时webviewclient抛出的错误页面。设置自定义webview客户端并覆盖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" />
第三,要在不重新启动应用的情况下转到链接,您必须:
将此代码添加到您构建网页视图的位置
if(savedInstanceState == null)
{ wv.loadUrl( url here ); }
添加以下两种方法:
@覆盖 protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); wv.saveState(outState); }
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onSaveInstanceState(savedInstanceState);
wv.restoreState(savedInstanceState);
}
第三,在重新加载页面时,我所做的是
答案 2 :(得分:-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>
在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;
}
足够简单:)