【问题标题】:Android WebView not loading URLAndroid WebView 未加载 URL
【发布时间】:2013-04-18 21:29:47
【问题描述】:

我想在WebView中加载URL

我使用了以下代码:

webView = (WebView) findViewById(R.id.webview1);
webView.setWebViewClient(new HostsWebClient());
webView.getSettings().setPluginState(PluginState.ON);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
webView.getSettings().setPluginsEnabled(true);
webView.getSettings().setSupportMultipleWindows(false);
webView.getSettings().setSupportZoom(false);
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);

webView.loadUrl(URL);

但是当我执行它时,我无法加载 url。我的网页不可用。

有人可以帮忙吗?

【问题讨论】:

  • 在默认的 android 浏览器中加载 URL 是否有效?
  • 您是否已授予 Internet 权限?
  • @LeonLucardie 在设备浏览器中工作
  • @Lucifer 是在 AndriodManifest 中给出的
  • 还要确保网址以“http://”或“https://”开头

标签: android android-layout android-intent android-webview


【解决方案1】:

您是否在清单文件中添加了互联网权限?如果没有添加以下行。

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

希望这会对你有所帮助。

编辑

使用下面的行。


    public class WebViewDemo extends Activity {


        private WebView webView;


        Activity activity ;
        private ProgressDialog progDailog; 

        @SuppressLint("NewApi")
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            activity = this;

            progDailog = ProgressDialog.show(activity, "Loading","Please wait...", true);
            progDailog.setCancelable(false);



           webView = (WebView) findViewById(R.id.webview_compontent);



           webView.getSettings().setJavaScriptEnabled(true);     
           webView.getSettings().setLoadWithOverviewMode(true);
           webView.getSettings().setUseWideViewPort(true);        
            webView.setWebViewClient(new WebViewClient(){

                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    progDailog.show();
                    view.loadUrl(url);

                    return true;                
                }
                @Override
                public void onPageFinished(WebView view, final String url) {
                    progDailog.dismiss();
                }
            });

            webView.loadUrl("http://www.teluguoneradio.com/rssHostDescr.php?hostId=147");

           }
    }

【讨论】:

  • 你救了我的命。谢谢你。漂亮而干净的代码。我还了解到制作一个简单的进度条是多么容易。
  • 最好加上 Handler.post(hideDialog, 300) 没有闪烁的对话框
  • 你是男人中的神。
  • @deprecated 使用 {@link #shouldOverrideUrlLoading(WebView, WebResourceRequest) shouldOverrideUrlLoading(WebView, WebResourceRequest)} 代替。
  • 在 shouldOverrideUrlLoading() 方法中,不要用请求的 URL 调用 WebView#loadUrl(String) 然后返回 true。这会不必要地取消当前加载并使用相同的 URL 开始新的加载。继续加载给定 URL 的正确方法是简单地返回 false,而不调用 WebView#loadUrl(String)。并且可以为子帧和非 HTTP(S) 方案调用此方法;使用这样的 URL 调用 WebView#loadUrl(String) 将失败。
【解决方案2】:

在清单中添加权限 Internet 权限。

作为&lt;uses-permission android:name="android.permission.INTERNET"/&gt;

这段代码可以正常工作

  public class WebActivity extends Activity {
  WebView wv;

 String url="http://www.teluguoneradio.com/rssHostDescr.php?hostId=147";

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_web);
    wv=(WebView)findViewById(R.id.webUrl_WEB);



WebSettings webSettings = wv.getSettings();
    wv.getSettings().setLoadWithOverviewMode(true);
    wv.getSettings().setUseWideViewPort(true);
    wv.getSettings().setBuiltInZoomControls(true);
    wv.getSettings().setPluginState(PluginState.ON);


    wv.setWebViewClient(new myWebClient());

    wv.loadUrl(url);
}




public class myWebClient extends WebViewClient {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        // TODO Auto-generated method stub
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // TODO Auto-generated method stub

        view.loadUrl(url);
        return true;

    }
}

【讨论】:

  • 旁注:你没有使用webSettings变量
  • 为什么setLoadWithOverviewMode 很重要?
【解决方案3】:

也许是 SSL

    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        // ignore ssl error
        if (handler != null){
            handler.proceed();
        } else {
            super.onReceivedSslError(view, null, error);
        }
    }

【讨论】:

    【解决方案4】:

    注意:确保已授予互联网权限。

    在安卓 9.0 中,

    Webview 或 Imageloader 无法加载 url 或图像,因为 android 9 存在网络安全问题,需要通过清单文件为所有子域启用。所以你可以添加安全配置文件。

    1. 将@xml/network_security_config 添加到您的资源中:

    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">www.google.com</domain>
        </domain-config>
    </network-security-config>
    1. 将此安全配置添加到您的清单中,如下所示:

    <application
       
        android:networkSecurityConfig="@xml/network_security_config"
        ...>
    </application>

    如果要允许所有子域

    <application
       android:usesCleartextTraffic="true"
        ...>
    </application>

    注意:要解决问题,不要同时使用第 2 点(android:networkSecurityConfig="@xml/network_security_config"android:usesCleartextTraffic="true")选择其中之一

    【讨论】:

    • 注意:要解决问题,不要同时使用第 2 点(android:networkSecurityConfig="@xml/network_security_config"android:usesCleartextTraffic="true")选择其中之一。我无法在 25 岁以上的 android 上打开 url,因为我都插入了 android manifest。 :)
    • generaly remove android:networkSecurityConfig="@xml/network_security_config" 因为您将在 live apk 中打开您不知道的 url,所以如果您确定域然后在 network_security_config 中提及作为子域,否则删除 android: networkSecurityConfig
    • 我面临如下问题:我有 2 个 URL,第一个 url 在 Webview 中不存在,但是当我点击第二个 url 时,然后尝试加载第一个 url;工作正常。 - 但每次我需要在第 2 次和第 1 次点击时,请告诉我有什么问题?
    • 在您的网络安全配置文件中添加子域
    • @Arbaz.in 酷。希望它会帮助你。 blogs.datanapps.com
    【解决方案5】:

    首先,检查 Manifest 文件中是否有 Internet 权限。

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

    然后您可以在 onCreate() 或 initialize() 方法中添加以下代码 -

    final WebView webview = (WebView) rootView.findViewById(R.id.webview);
            webview.setWebViewClient(new MyWebViewClient());
            webview.getSettings().setBuiltInZoomControls(false);
            webview.getSettings().setSupportZoom(false);
            webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
            webview.getSettings().setAllowFileAccess(true);
            webview.getSettings().setDomStorageEnabled(true);
            webview.loadUrl(URL);
    

    并编写一个类来处理 webview 的回调 -

    public class MyWebViewClient extends WebViewClient {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                               //your handling...
                    return super.shouldOverrideUrlLoading(view, url);
            }
        }
    

    在同一个类中,您还可以使用其他重要的回调,例如 -

    - onPageStarted()
    - onPageFinished()
    - onReceivedSslError()
    

    另外,您可以添加“SwipeRefreshLayout”以启用滑动刷新并刷新 web 视图。

    <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipeRefreshLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <WebView
                android:id="@+id/webview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </android.support.v4.widget.SwipeRefreshLayout>
    

    当用户滑动屏幕时刷新网页视图:

    SwipeRefreshLayout mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
                mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                    @Override
                    public void onRefresh() {
                        new Handler().postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                mSwipeRefreshLayout.setRefreshing(false);
                                webview.reload();
                            }
                        }, 3000);
                    }
                });
    

    【讨论】:

      【解决方案6】:

      在您的 webview 上使用以下内容

      webview.setWebChromeClient(new WebChromeClient());
      

      然后实现 WebChromeClient 类所需的方法。

      【讨论】:

      • 需要哪些方法?
      • WebChromeClient()中不需要任何方法
      • 如果有人也面临同样的问题,为了让 webview 加载 web 内容,有必要使用 WebViewClient 实例调用其方法 setWebViewClient。无需重写任何方法。
      【解决方案7】:

      对于某些网页,关键是启用 DOM 存储

      webview.getSettings().setDomStorageEnabled(true);
      

      【讨论】:

      • Webview 没有加载带有子域的 URL,例如 food.misiki.in 这个技巧解决了这个问题。非常感谢
      • 在我的情况下,来自 webView 的响应没有发送到目标 Url,这很奇怪。这个参数以某种方式解决了这个问题....不明白为什么。谢谢!
      【解决方案8】:

      作为替代解决方案:

      对我来说,webView.getSettings().setUserAgentString("Android WebView") 成功了。

      我已经实现了 INTERNET 权限和WebViewClient 以及WebChromeClient

      【讨论】:

        【解决方案9】:

        在我的情况下,将以下函数添加到 WebViewClient 修复了错误。 函数分别是:onReceivedSslErrorshouldOverrideUrlLoading 的弃用和新 api 版本

                webView.setWebViewClient(new WebViewClient() {
        
                @SuppressWarnings("deprecation")
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    Log.i(TAG, "loading: deprecation");
                    return  true;
                    //return super.shouldOverrideUrlLoading(view, url);
                }
        
                @Override
                @TargetApi(Build.VERSION_CODES.N)
                public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                    view.loadUrl(request.getUrl().toString());
                    Log.i(TAG, "loading: build.VERSION_CODES.N");
                    return true;
                    //return super.shouldOverrideUrlLoading(view, request);
                }
        
                @Override
                public void onPageStarted(
                        WebView view, String url, Bitmap favicon) {
                    Log.i(TAG, "page started:"+url);
                    super.onPageStarted(view, url, favicon);
                }
        
                @Override
                public void onPageFinished(WebView view, final String url) {
        
                    Log.i(TAG, "page finished:"+url);
        
                }
        
                @Override
                public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError er) {
                    handler.proceed();
                }
        
            });
        

        【讨论】:

          【解决方案10】:

          最简单的解决方案是转到包含 webview 的 XML 布局。将您的 android:layout_width 和 android:layout_height 从“wrap_content”更改为“match_parent”。

            <WebView
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:id="@+id/webView"/>
          

          【讨论】:

          • 感谢您节省了很多时间,这个技巧奏效了。再次感谢。!!
          【解决方案11】:

          使用它应该会有所帮助。

           var currentUrl = "google.com" 
           var partOfUrl = currentUrl.substring(0, currentUrl.length-2)
          
           webView.setWebViewClient(object: WebViewClient() {
          
           override fun onLoadResource(WebView view, String url) {
           //call loadUrl() method  here 
           // also check if url contains partOfUrl, if not load it differently.
           if(url.contains(partOfUrl, true)) {
               //it should work if you reach inside this if scope.
           } else if(!(currentUrl.startWith("w", true))) {
               webView.loadurl("www.$currentUrl")
          
           } else if(!(currentUrl.startWith("h", true))) {
               webView.loadurl("https://$currentUrl")
          
           } else { 
             //...
           }
           }
          
           override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
            // you can call again loadUrl from here too if there is any error.
          }
           // You should also override other override method for error such as
           // onReceiveError to see how all these methods are called one after another and how
          // they behave while debugging with break point. 
          } 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-11-16
            • 2020-03-04
            • 1970-01-01
            • 1970-01-01
            • 2016-07-18
            • 1970-01-01
            • 2018-10-18
            • 2013-09-12
            相关资源
            最近更新 更多