Android Web 视图异常

Android WebView Exception

我在 android 中使用 WebView。当我单击三个按钮之一时,它会在屏幕的其余部分呈现一个相关网站。当我点击第一个按钮时,效果很好(图 1)(http://www.baidu.com)。但是当我点击剩下的两个时,它会弹出一个提示让我选择浏览器(图2)。为什么不能渲染成第一个?

我的activity.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".WebsiteSwitcher"
android:orientation="vertical">

<TableLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TableRow>
        <Button
            android:id="@+id/button_one"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Baidu"/>
        <Button
            android:id="@+id/button_two"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Weibo"/>
        <Button
            android:id="@+id/button_three"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Renren"/>
    </TableRow>

</TableLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <WebView  xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
    />

</LinearLayout>

而我在 onCreate 方法中的代码是这样的:

Button goBaidu = (Button)findViewById(R.id.button_one);
    goBaidu.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            webView.getSettings().setJavaScriptEnabled(true);
            webView.loadUrl("http://www.baidu.com");
        }

    });

it pops out a hint to let me choose the browser(picture 2). Why it can not be rendered as the first one?

通过重写 shouldOverrideUrlLoading :

从 WebView 设置 WebViewClient 中的网页上单击的链接加载其他页面
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
});

只需设置 WebViewClient 即可:

webView.setWebViewClient(new WebViewClient());

文档说 "If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url"。一旦你提供它,即使是默认的,WebView 已经开始自己加载 URL。

事实上,调用 view.loadUrl(url) 并从 shouldOverrideUrlLoading 返回 true 并不是最好的做法,因为 shouldOverrideUrlLoading 也会被非 https 的子帧调用方案(例如 tel:)。