【问题标题】:Opening webview not in new browser不在新浏览器中打开 webview
【发布时间】:2011-07-30 12:32:04
【问题描述】:

我正在实现一个 webview。我想要网页顶部的两个按钮。

我有一个垂直的线性布局,里面是一个带有两个按钮的水平布局,以及一个在水平布局之外的 webview。

我只是在 Java 代码中加载 Google URL。

每次我运行应用程序时,它都会在应用程序顶部打开一个新浏览器,并且按钮会被隐藏。它没有显示 webview 上方的按钮。 请帮助并告诉我如何在不打开另一个浏览器的情况下在 webview 中加载 URL,或者如何通过打开本机浏览器来阻止它,以便页面加载到 webview 本身而不是新浏览器中。

谢谢大家

【问题讨论】:

    标签: android webview


    【解决方案1】:

    布局应该是这样的:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                     android:layout_height="fill_parent"
                     android:layout_width="fill_parent"
                     android:orientation="vertical">
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content">
                <Button android:id="@+id/button1"
                    android:layout_width="0dip"
                    android:layout_height="wrap_content"                
                    android:layout_gravity="top"
                    android:layout_weight="1"/>
                <Button android:id="@+id/button2"
                    android:layout_width="0dip"
                    android:layout_height="wrap_content"                
                    android:layout_gravity="top"
                    android:layout_weight="1" />
            </LinearLayout>
            <WebView 
                android:id="@+id/webview"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"/>
    </LinearLayout>
    

    您也可以参考Need help changing from stock android browser to webview 看看您是否正确启动了该网址。

    【讨论】:

    • 感谢您的回复..但我的问题仍然存在。一旦我将 url 加载到 webview,它就会全屏显示,就好像在应用程序上打开了一个新的活动或浏览器一样。单击后退按钮时,它会将我带到应用程序,在该应用程序中我可以看到 2 个按钮和空白和白色的 web 视图。
    • 你能在你的 webview 的父活动中分享代码吗......只是相关的部分。此外,启动 url 的代码。
    • 您是否在browser.loadUrl("google.com");之前添加了以下内容-browser.setWebViewClient(new WebViewClientSubClass());
    • 我的猜测是(如果页面正在加载),由于 WebView 没有与之关联的客户端,系统可能正在请求股票浏览器启动 url。
    • @QadirHussain,向 WebView 注册一个 onKeyListener(),并捕获 按钮。根据您的 WebView 中页面的当前状态,您可以为所欲为。
    【解决方案2】:

    是的。您必须在此类中实现WebViewClient 类和Override shouldOverrideURLLoading() 方法。

    为什么?因为webview 只是打开你的“确切链接”,如果该链接重定向其他链接,android 将为此操作打开默认浏览器。

    如您所知,在您的示例中,当您连接到 google.com 时,google 将重定向到您所在国家/地区的 google。例如,如果您在中国,google 会转到google.com.cn,如果在越南,则会转到google.com.vn

    这是我的简单示例:(你可以想象这是一个新的浏览器,:笑)

    首先是布局xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
    
            <EditText 
                android:id="@+id/url"
                android:layout_height="wrap_content"
                android:layout_width="fill_parent"
                android:layout_weight="1"
                android:hint="Input URL"/>
    
            <Button 
                android:id="@+id/run"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:layout_weight="0"
                android:text="GO"/>
    
        </LinearLayout>
    
        <WebView 
            android:id="@+id/webview"
            android:layout_height="fill_parent"
            android:layout_width="fill_parent"/>
    
    </LinearLayout>
    

    这是主要活动的代码:

    package com.basic;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Button;
    import android.widget.EditText;
    
    public class WebViewExample extends Activity{ 
    
        WebView webView;
    
        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.webview);
    
            webView = (WebView) findViewById(R.id.webview);
    
            Button button = (Button) findViewById (R.id.run);
            button.setOnClickListener(new OnClickListener() {           
                @Override
                public void onClick(View v) {
                    gotoPage();             
                }
            });
    
        }
    
        private void gotoPage(){
    
            EditText text = (EditText) findViewById(R.id.url);
            String url = text.getText().toString();
    
            WebSettings webSettings = webView.getSettings();
            webSettings.setBuiltInZoomControls(true);
    
            webView.setWebViewClient(new Callback());  //HERE IS THE MAIN CHANGE
            webView.loadUrl(url);
    
        }
    
        private class Callback extends WebViewClient{  //HERE IS THE MAIN CHANGE. 
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return (false);
            }
    
        }
    
    }
    

    希望对你有帮助:)

    【讨论】:

    • 我必须实现 WebViewClient 因为 webview.loadUrl() 直接打开浏览器。但仅在带有 ICS (4.0.3) 的 Xoom 上与我在 Honeycomb (3.2.1) 下的 Acer Iconia 7' 完美配合。你听说过这样的事吗?
    【解决方案3】:

    在loadUrl()之前添加如下代码就可以解决这个问题,

    wv.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
              view.loadUrl(url);
              return true;
               }}); 
    

    来自 WebViewClient 的 shouldOverrideUrlLoading() 可以完成这项工作。这是 shouldOverrideUrlLoading 的 Android 文档,

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

    http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldOverrideUrlLoading%28android.webkit.WebView,%20java.lang.String%29

    【讨论】:

    • 这是完全错误的;它将每个重定向的 url 添加到历史堆栈。根据其他答案,您的 Web 视图客户端应该简单地返回 false。它不应该调用loadUrl 并返回true
    【解决方案4】:

    在具有 webview 的 xml 文件中添加以下行

    tools:context=".MyActivity"(您的活动名称)

    【讨论】:

      【解决方案5】:

      我试过这个。它为我工作。它不会打开新窗口。它只会打开 webview 页面。它隐藏了新的浏览器询问窗口打开..

      private WebView webView;
      String strUrl="url" ;
      
      webView = (WebView) findViewById(R.id.webView1);
      webView.getSettings().setJavaScriptEnabled(true);
      webView.loadUrl(strUrl);
      webView.setWebViewClient(new WebViewClient());
      

      【讨论】:

      • 首先是setWebViewClient,然后是loadUrl
      【解决方案6】:

      我遇到了完全相同的问题,幸运的是,在浏览网页大约一个小时后,我混合了一些我发现的东西并且它起作用了。

      这是代码:

      WebView webView;
      webView = ((WebView) rootView.findViewById(R.id.detail_area));
      webView.getSettings().setJavaScriptEnabled(true);
      webView.setWebViewClient(new WebViewClient());
      webView.loadUrl(mItem.link);
      

      “detail_area”是我的 webview,rootView 是我在“主/详细信息流”中选择的项目,链接是我要打开的 URL。

      【讨论】:

        【解决方案7】:

        我的 XML 实现:

        <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
            android:layout_height="match_parent">
        
        <WebView
            android:background="@android:color/transparent"
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></WebView>
        </RelativeLayout>
        

        我的 Java 实现:

        WebView webView;
        public final String GlobalUrl = "http://slashdot.org/";
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.my_application_activity);
        
            webView = (WebView) findViewById(R.id.webView);
            loadWebViewLoad(webView);
        }
        
        private void loadWebViewLoad(WebView webview) {
            webview.getSettings().setJavaScriptEnabled(true);
            webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
            webview.getSettings().setSupportMultipleWindows(true);
            webview.setWebViewClient(new WebViewClient());
            webview.setWebChromeClient(new WebChromeClient());
            webview.loadUrl(GlobalUrl);
        }
        

        最后的结果是:

        【讨论】:

          【解决方案8】:

          这段代码对我有用 谢谢...

              WebView wbView = (WebView) findViewById(R.id.webView);
          
              wbView.getSettings().setJavaScriptEnabled(true);
              wbView.setWebViewClient(new WebViewClient());
              wbView.loadUrl("http://ppid.polinela.ac.id");
          

          【讨论】:

          • 包含对您的代码的解释将使此答案更有用。此外,此代码与至少一个现有答案中的示例几乎相同,因此这似乎没有为讨论提供任何新信息。
          【解决方案9】:

          这可能是一个迟到的帖子,但它可能会帮助其他开发人员......

          您需要在 webview 上设置 setWebViewClient,然后在其上加载 URL,如下所示,

          webview.setWebViewClient(new WebViewClient() {
              public boolean shouldOverrideUrlLoading(WebView view, String url) {
                  return false;
              }
          });
          

          上面代码的一些背景,文档用文字描述了 shouldOverrideUrlLoading 方法。

           * @param view The WebView that is initiating the callback.
           * @param request Object containing the details of the request.
           * @return {@code true} if the host application wants to leave the current WebView
           *         and handle the url itself, otherwise return {@code false}.
           */
          @Override
          @SuppressWarnings("deprecation") // for invoking the old shouldOverrideUrlLoading.
          @RequiresApi(21)
          public boolean shouldOverrideUrlLoading(@NonNull WebView view,
                  @NonNull WebResourceRequest request) {
              if (Build.VERSION.SDK_INT < 21) return false;
              return shouldOverrideUrlLoading(view, request.getUrl().toString());
          }
          

          如果您看到上面关于返回值的文档,它会说,

          @return {@code true} if the host application wants to leave the current WebView
            *and handle the url itself, otherwise return {@code false}.
          

          所以它简单地说,如果你从 shouldOverrideUrlLoading 方法返回 true,它会要求你设备的默认浏览器处理打开 URL 的请求,如果您返回 false,那么您的 URL 将仅通过 webview 加载。

          现在您可以在此 setWebViewClient 调用之后在 webview 中加载您的 URL,也可以在返回值之前在 shouldOverrideUrlLoading 方法中加载您的 URL。

          【讨论】:

            猜你喜欢
            • 2012-09-29
            • 1970-01-01
            • 2016-12-29
            • 1970-01-01
            • 1970-01-01
            • 2013-02-05
            • 1970-01-01
            • 2012-10-30
            • 1970-01-01
            相关资源
            最近更新 更多