【问题标题】:Android webview launches browser when calling loadurlAndroid webview在调用loadurl时启动浏览器
【发布时间】:2011-12-06 11:31:34
【问题描述】:

我创建了一个Activity,它在LinearLayout 中有一个标题和一个网络视图。在onResume() 方法中,它调用webView.loadUrl(url)。问题是活动首​​先显示标题而屏幕的其余部分为空白,然后设备浏览器启动时显示 URL 页面。我想看到的是标题下方WebView 中显示的页面。可能是什么问题?

编辑: 好的,做了一些进一步的搜索,找到了这个:

Clicking URLs opens default browser

指向WebView教程here

只需实现网络客户端并设置它。

【问题讨论】:

  • 我提到这个是因为你解决了我的问题...谢谢。
  • @Ray,如果您找到了解决方案,请考虑写下这个问题的答案,并接受它。这将帮助其他有同样问题的人。
  • 我遇到了一个更严重的问题。事实证明,如果不使用自定义 WebViewClient,即使是 redirect 也会随浏览器一起加载。

标签: android android-webview webviewclient


【解决方案1】:

根据 Maudicus 和 Hit 的建议回答我的问题。

查看 WebView 教程here。 只需实现 Web 客户端并在 loadUrl 之前设置它。最简单的方法是:

myWebView.setWebViewClient(new WebViewClient());

要对 Web 内容进行更高级的处理,请考虑使用 ChromeClient。

【讨论】:

  • 避免WebView在打开初始页面时启动默认浏览器。
  • 感谢这个令人难以置信的神奇小魔法! +1 ...为你减一,Android ...
  • 优秀的答案。也解决了我的问题。
  • 这仅适用于初始加载吗?如果您想在应用内导航浏览器怎么办?
  • myWebView.webViewClient = WebViewClient() 在 Kotlin 中!
【解决方案2】:

使用这个:

lWebView.setWebViewClient(new WebViewClient());

【讨论】:

  • @DigvijaySingh 检查已接受答案的原件。最初它没有此代码。它是在这个答案之后添加的
【解决方案3】:

这样使用:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dedline);

    WebView myWebView = (WebView) findViewById(R.id.webView1);
    myWebView.setWebViewClient(new WebViewClient());
    myWebView.loadUrl("https://google.com");
}

【讨论】:

    【解决方案4】:

    像这样制作你的活动。

    public class MainActivity extends Activity {
    WebView browser;
    
    @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // find the WebView by name in the main.xml of step 2
        browser=(WebView)findViewById(R.id.wvwMain);
    
        // Enable javascript
        browser.getSettings().setJavaScriptEnabled(true);  
    
        // Set WebView client
        browser.setWebChromeClient(new WebChromeClient());
    
        browser.setWebViewClient(new WebViewClient() {
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                    }
            });
         // Load the webpage
        browser.loadUrl("http://google.com/");
       }
    }
    

    【讨论】:

    • setJavaScriptEnabled(true) 将 XSS 漏洞引入您的应用程序。如果您不需要 JavaScript,请不要使用它
    • 启用 JavaScript 的那一行非常重要,否则你会得到 You need to enable JavaScript to run this app. 并用谷歌搜索它只会发现人们对 react native 有问题,你会发疯的,因为 JavaScript 已经在浏览器设置中启用.
    • Wini,你可以的。像这样@ Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: if (mWebView.canGoBack()) { mWebView.goBack(); } else { finish(); } return true; } } return super.onKeyDown(keyCode, event); }
    【解决方案5】:

    我遇到了同样的问题,我找到了解决方案 Android's official Documentation about WebView

    这是我的onCreateView() 方法,这里我使用了两种方法打开网址

    方法 1 正在浏览器中打开 url 并且

    方法 2 正在您想要的 WebView 中打开 url。
    我正在为我的应用程序使用方法 2,这是我的代码:

    public class MainActivity extends Activity {
       private WebView myWebView;
    
         @Override
         public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
          View rootView = inflater.inflate(R.layout.fragment_webpage_detail, container, false);
    
          // Show the dummy content as text in a TextView.
          if (mItem != null) {
    
             /* Method : 1
              This following line is working fine BUT when we click the menu item then it opens the URL in BROWSER not in WebView */
             //((WebView)   rootView.findViewById(R.id.detail_area)).loadUrl(mItem.url);
    
            // Method : 2
            myWebView = (WebView) rootView.findViewById(R.id.detail_area); // get your WebView form your xml file
            myWebView.setWebViewClient(new WebViewClient()); // set the WebViewClient
            myWebView.loadUrl(mItem.url); // Load your desired url
        }
    
        return rootView;
    }                                                                                               }
    

    【讨论】:

      【解决方案6】:

      试试这个代码...

      private void startWebView(String url) {
      
          //Create new webview Client to show progress dialog
          //When opening a url or click on link
      
          webView.setWebViewClient(new WebViewClient() {      
              ProgressDialog progressDialog;
      
              //If you will not use this method url links are opeen in new brower not in webview
              public boolean shouldOverrideUrlLoading(WebView view, String url) {              
                  view.loadUrl(url);
                  return true;
              }
      
              //Show loader on url load
              public void onLoadResource (final WebView view, String url) {
                  if (progressDialog == null) {
                      // in standard case YourActivity.this
                      progressDialog = new ProgressDialog(view.getContext());
                      progressDialog.setMessage("Loading...");
                      progressDialog.show();
                  }
              }
              public void onPageFinished(WebView view, String url) {
                  try{
                  if (progressDialog.isShowing()) {
                      progressDialog.dismiss();
                      progressDialog = null;
                  }
                  }catch(Exception exception){
                      exception.printStackTrace();
                  }
              }
      
          }); 
      
           // Javascript inabled on webview  
          webView.getSettings().setJavaScriptEnabled(true); 
      
          // Other webview options
          /*
          webView.getSettings().setLoadWithOverviewMode(true);
          webView.getSettings().setUseWideViewPort(true);
          webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
          webView.setScrollbarFadingEnabled(false);
          webView.getSettings().setBuiltInZoomControls(true);
          */
      
          /*
           String summary = "<html><body>You scored <b>192</b> points.</body></html>";
           webview.loadData(summary, "text/html", null); 
           */
      
          //Load url in webview
          webView.loadUrl(url);
      }
      

      【讨论】:

        【解决方案7】:

        如果您看到 an empty page,请启用 JavaScript。

        webView.setWebViewClient(new WebViewClient());
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webView.loadUrl(url);
        

        【讨论】:

          【解决方案8】:

          简单回答你可以这样使用

          public class MainActivity extends AppCompatActivity {
          
               @Override
               protected void onCreate(Bundle savedInstanceState) {
                   super.onCreate(savedInstanceState);
                   WebView webView = new WebView(this);
                   setContentView(webView);
                   webView.setWebViewClient(new WebViewClient());
                   webView.loadUrl("http://www.google.com");
             }
          }
          

          【讨论】:

            【解决方案9】:

            如果您使用的是 webChromeClient,我建议您同时使用 webChromeClientwebViewClient。因为 webChromeClient 不提供 shouldOverrideUrlLoading。两者都可以使用。

                    webview.webViewClient = WebViewClient()
                    webview.webChromeClient = Callback()
            
            private inner class Callback : WebChromeClient() {
                    override fun onProgressChanged(view: WebView?, newProgress: Int) {
                        super.onProgressChanged(view, newProgress)
                       
                        if (newProgress == 0) {
                            progressBar.visibility = View.VISIBLE
                        } else if (newProgress == 100) {
                            progressBar.visibility = View.GONE
                        }
                    }
            
                }
            
            

            【讨论】:

            • 该死的,我什至没有想到同时使用这两种方法。我使用来自WebViewClientonPageFinished() 和来自WebChromeClientonConsoleMessage()。谢谢!
            【解决方案10】:

            我刚刚发现这取决于 URL 的格式:

            我的代码只是使用

            webview.loadUrl(url)
            

            无需设置

            webView.setWebViewClient(new WebViewClient())
            

            至少在我的情况下。 也许这对你们中的一些人有用。

            【讨论】:

            • 它仍然在浏览器中以结束/不正确的答案打开..
            • 实际上,我发现了同样的行为。不知道如何解释,但这也是我所看到的。
            猜你喜欢
            • 2014-01-17
            • 2013-02-05
            • 1970-01-01
            • 2011-11-15
            • 2014-08-24
            • 1970-01-01
            • 2014-12-27
            • 2012-06-29
            相关资源
            最近更新 更多