【问题标题】:Does WebView need a WebViewClient to work?WebView 是否需要 WebViewClient 才能工作?
【发布时间】:2012-02-03 03:32:54
【问题描述】:

我正在阅读 android 教程并尝试了 WebView 示例。这就是我最终得到的结果:

WebAppActivity

public class WebAppActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        WebView wv = (WebView) findViewById(R.id.webView1);
        wv.loadUrl("http://www.google.com");

    }
}

ma​​in.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/webView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </WebView>

</LinearLayout>

但不是在应用程序本身中加载页面,而是在应用程序启动时打开默认的 android 浏览器,并且页面在浏览器而不是应用程序中加载。当我按下返回时,我返回到显示空白屏幕的应用程序活动。

有人知道为什么会这样吗?

编辑:

清单

<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.INTERNET"/>

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:label="@string/app_name"
        android:name=".WebAppActivity" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

这只是为了表明我已经添加了 INTERNET 权限

编辑:

只要我添加了WebViewClient

wv.setWebViewClient(new WebViewClient() {});

页面在应用程序中加载。这是预期的行为吗? Android WebView 需要 WebViewClient 吗? (找不到任何文档)

编辑:

我注意到当我在具有 Google API 的模拟器中安装 apk 时会出现此问题。在普通模拟器(没有 Google API)上,它的行为符合预期。

【问题讨论】:

  • 您的问题已在以下位置得到解答:stackoverflow.com/questions/2378800/…
  • @silent 请仔细阅读。那不是我的问题。我在加载第一页本身时遇到问题,它在浏览器而不是应用程序中加载。见弗洛的评论
  • 不,我认为他不是在谈论被点击的网页本身的链接。这听起来像网页根本没有加载到 WebView 中。
  • 这里有一个详细的例子:Android - WebView client example,同意你@silent。
  • @PareshMayani 甚至没有加载第一页。我说的是链接点击。我尝试使用webView.loadUrl("http://google.com") 加载的第一页没有被加载。它直接调用浏览器。这是预期的行为吗?

标签: android android-webview


【解决方案1】:

是的,您必须设置一个 WebViewClient,它在被覆盖的方法“shouldOverrideUrlLoading”上返回 true,以便您的 webview 将 URL 加载到您的应用中。

如果你想要一个例子,请告诉我。


编辑

@Aki WebViewClient.shouldOverrideUrlLoading Documentation

当一个新的 url 即将被加载到当前的 WebView 中时,给宿主应用程序一个接管控制权的机会。 如果未提供 WebViewClient,默认情况下 WebView 将要求 Activity Manager 为 url 选择正确的处理程序。如果提供了 WebViewClient,则返回 true 表示宿主应用程序处理 url,返回 false 表示当前 WebView 处理 url。

【讨论】:

  • @Christopher 为什么我们需要一个 webViewClient 仅在设备带有 google apis 的情况下。此外,您能否指出一些说明这一事实的官方 Android 文档?
  • 谢谢克里斯托弗。但它并没有说当我们调用loadUrl 方法时会调用shouldOverrideUrlLoading
【解决方案2】:

从 url 加载网页到 webview,不需要设置 webview 客户端。如果没有 webview 客户端,您可以将网页加载到 webview 中。但是 WebViewClient 为处理 webview 带来了许多优势。从 url 加载网页的示例用法,


webView.loadUrl(yoururl);

【讨论】:

    【解决方案3】:
    private WebView webVenue;
    private WebSettings websettings;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
    
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.schedule_time);
    
            webVenue = (WebView)findViewById(R.id.webview_schedule_time);
            txtEmptyMsg = (TextView)findViewById(R.id.txtEmptyMsg);
    
            mContext = this;        
            webVenue.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
            webVenue.getSettings().setJavaScriptEnabled(true);
            websettings=webVenue.getSettings();
            webVenue.setScrollBarStyle(ScrollView.SCROLLBARS_OUTSIDE_OVERLAY);
            webVenue.loadUrl(URL);
    }
    }
    

    一切顺利...

    【讨论】:

    • 感谢您的回答。我知道其他方法可以让它工作。例如添加一个WebViewClient 让它工作。让它工作不是我关心的。找出它为什么不起作用,是。
    • 它在应用程序中加载网页?还是在 Android 浏览器中?
    • 我认为在简单地使用 loadurl() 时,会在浏览器中打开 url
    • 是的,删除了我的评论,因为它不再与您当前的情况有关。
    【解决方案4】:

    不完全是,但它可以让你做很多事情。

    请注意,在 WebViewClient 中调用 shouldOverrideUrlLoading 似乎也不起作用,因此您应该在 onPageFinished 中进行处理。

    这是一个blog post,它将指导您完成。

    【讨论】:

      【解决方案5】:

      在默认的android浏览器中打开url的唯一原因是因为"wv.loadUrl("http://www.google.com");"

      当您加载http://www.google.com 时,谷歌网站实际上将页面重定向到http://www.google.co.in(假设您从印度启动该应用程序)。

      如果您运行“wv.loadUrl("http://www.google.co.in");”,google 将不会重定向页面,第一页将在您的应用程序中打开,进一步的点击将在系统浏览器中打开。

      要处理这种进一步的点击,您需要 WebViewClient。

      【讨论】:

        猜你喜欢
        • 2021-06-26
        • 1970-01-01
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 2012-01-06
        • 2018-01-30
        相关资源
        最近更新 更多