Android WebView无法加载网址?

11

我有一个Android WebView,应该加载以下网址:

https://buchung.salonmeister.de/ort/301655/menue/#offerId=907601&venueId=301655

https://buchung.salonmeister.de/place/#offer-details-page?id=907599&venueId=301655

以下是我的做法:

<RelativeLayout 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:background="@android:color/holo_orange_light"
                tools:context=".MainActivityFragment">



    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_margin="5dp"
        android:layout_above="@+id/progressBar"></WebView>


    <ProgressBar
        android:id="@id/progressBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:visibility="invisible"
        style="?android:attr/progressBarStyleHorizontal"/>

    <TextView
        android:id="@+id/titleView"
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>

onCreateView() 方法中:

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                           Bundle savedInstanceState) {
       View v = inflater.inflate(R.layout.fragment_main, container, false);

        String url = // some url
        final ProgressBar progressBar = (ProgressBar)v.findViewById(R.id.progressBar);
        progressBar.setMax(100);

        final TextView titleView = (TextView)v.findViewById(R.id.titleView);


        mWebView = (WebView)v.findViewById(R.id.webView);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setAllowFileAccess(true);
        mWebView.getSettings().setAllowContentAccess(true);

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

        mWebView.setWebChromeClient(new WebChromeClient() {
          @Override
          public void onProgressChanged(WebView view, int progress) {
            if (progress == 100) {
              progressBar.setVisibility(View.INVISIBLE);
              progressBar.setProgress(0);
            } else {
              progressBar.setVisibility(View.VISIBLE);
              progressBar.setProgress(progress);
            }
          }

          @Override
          public void onReceivedTitle(WebView view, String title) {
            titleView.setText(title);
          }
        });
        mWebView.loadUrl(url);

        return v;
}

当我启动我的活动时,屏幕是空的。

注意:这不是布局问题,请不要评论布局,专注于真正的问题。

我该如何在WebView中加载上述URL?

编辑:这是我授予的权限:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

编辑:

我的控制台显示如下:

I/chromium: [INFO:CONSOLE(84)] "undefined", source: https://buchung.salonmeister.de/place/ (84)

09-13 15:12:33.230 28407-28407/de.test.webviewtest I/chromium: [INFO:CONSOLE(1)] "Uncaught Error: Script error for: widget/venue-menu/mobile/venue-menu-app
09-13 15:12:33.230 28407-28407/de.test.webviewtest I/chromium: http://requirejs.org/docs/errors.html#scripterror", source: https://buchung.salonmeister.de/javascript-module/1.162.3/thirdparty/require.2.1.10.js (1)

2
你在 AndroidManifest.xml 中添加了 Internet 权限吗? - Jibran Khan
2
请检查您的WebView的父级或外部XML,或将其粘贴在此处。 - Rohan Pawar
2
@RohanPawar 我更新了我的帖子。 - Michael
2
你的布局很奇怪。 - njzk2
3
你是否忘记将片段添加到活动中了? - Stephane Mathis
显示剩余4条评论
7个回答

7
第一个问题是必须交换ProgressBar和WebView的位置。
<ProgressBar
    android:id="@id/progressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:visibility="invisible"
    style="?android:attr/progressBarStyleHorizontal"/>

<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:layout_margin="5dp"
    android:layout_above="@id/progressBar"/> 

第二个问题是这行代码:
android:layout_above="@+id/progressBar"

在RelativeLayout中,您必须提前声明视图ID,以便可以将另一个视图布局在其上方(右侧和左侧同理)。

同样的道理适用于同一行内的其他视图:

android:layout_above="@+id/progressBar"

在RelativeView中,一个视图不能布局在一个没有任何生成ID的控件之上(或下方、左侧或右侧)。

您可以这样做:

@+id/progressBar

IDE将自动生成一个新的ID,这个ID不是您指的放置在上面的WebView的相同ID。在进度条声明中,您再次使用@+id/progressBar,它会重新生成另一个ID。

因此,您的WebView被布局在空白处,您甚至看不到WebView,它可能加载URL,而您只是看不到它。

祝好运。


4
好的,这跟我的问题无关。 - Michael
confile 你有解决方案吗?我卡在同样的问题上了。 - Nitish Srivastava

5

你的 URL 是 https,所以这是 SSL 问题。

你可以在其他问题中找到解决方案。

mWebView.setWebViewClient(new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed(); // Ignore SSL certificate errors
    }
});

你在WebViewClient中覆盖了onReceivedSslError()方法吗? - Hogun
如果您能提供一个可工作的代码示例链接,我会给您奖励。 - Michael

4

如果想要的话,可以尝试使用未确定进度条示例并移除setWebChromeClient。尝试以下代码:

public class WebViewActivityFragment extends Fragment {

 public WebViewActivityFragment() {
 }

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    //return inflater.inflate(R.layout.fragment_web_view, container, false);

    View v = inflater.inflate(R.layout.fragment_web_view, container, false);

    final String url = "https://buchung.salonmeister.de/ort/301655/menue/#offerId=907601&venueId=301655";//"https://google.com.vn";
    final ProgressBar progressBar = (ProgressBar)v.findViewById(R.id.progressBar);
    progressBar.setMax(100);
    progressBar.setVisibility(View.GONE);
    final TextView titleView = (TextView)v.findViewById(R.id.titleView);
    WebView mWebView = (WebView) v.findViewById(R.id.webView);
    mWebView.setInitialScale(1);
    mWebView.getSettings().setLoadWithOverviewMode(true);
    mWebView.getSettings().setUseWideViewPort(true);
    mWebView.getSettings().setJavaScriptEnabled(false);
    mWebView.getSettings().setAllowFileAccess(true);
    mWebView.getSettings().setAllowContentAccess(true);
    mWebView.setScrollbarFadingEnabled(false);
    mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }

         @Override
        public void onPageFinished(WebView view, String url) {
         progressBar.setVisibility(View.GONE);
         progressBar.setProgress(100);
         super.onPageFinished(view, url);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
         progressBar.setVisibility(View.VISIBLE);
         progressBar.setProgress(0);
         super.onPageStarted(view, url, favicon);
        }
    });


    mWebView.loadUrl(url);

    return v;
}

}


4
这不是解决方案。它不起作用! - Michael

3

更新:使用 setJavaScriptEnabled(false);,WebView 可以成功显示网址 "https://buchung.salonmeister.de/ort/301655/menue/#offerId=907601&venueId=301655"

enter image description here

public class WebViewActivityFragment extends Fragment {

    public WebViewActivityFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //return inflater.inflate(R.layout.fragment_web_view, container, false);

        View v = inflater.inflate(R.layout.fragment_web_view, container, false);

        final String url = "https://buchung.salonmeister.de/ort/301655/menue/#offerId=907601&venueId=301655";//"https://google.com.vn";
        final ProgressBar progressBar = (ProgressBar)v.findViewById(R.id.progressBar);
        progressBar.setMax(100);
        final TextView titleView = (TextView)v.findViewById(R.id.titleView);
        WebView mWebView = (WebView) v.findViewById(R.id.webView);
        mWebView.setInitialScale(1);
        mWebView.getSettings().setLoadWithOverviewMode(true);
        mWebView.getSettings().setUseWideViewPort(true);
        mWebView.getSettings().setJavaScriptEnabled(false);
        mWebView.getSettings().setAllowFileAccess(true);
        mWebView.getSettings().setAllowContentAccess(true);
        mWebView.setScrollbarFadingEnabled(false);
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return false;
            }
        });

        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int progress) {
                if (progress == 100) {
                    progressBar.setVisibility(View.INVISIBLE);
                    progressBar.setProgress(0);
                } else {
                    progressBar.setVisibility(View.VISIBLE);
                    progressBar.setProgress(progress);
                }
            }

            @Override
            public void onReceivedTitle(WebView view, String title) {
                titleView.setText(title);
            }


        });
        mWebView.loadUrl(url);

        return v;
    }
}

我已经使用了你的全部代码,这是我的网页视图结果。我认为可能是因为那个网站没有移动端准备好,因为我在手机上尝试用浏览器打开你的两个链接出现了同样的问题(仍在加载...)。

enter image description here


2
该网站已经具备移动设备适配功能,请在移动 Safari 或移动 Chrome 中打开。 - Michael
2
@confile:是的。我已经尝试删除mWebView.setWebChromeClient这一行,现在webView可以加载URL了。 - BNK
2
但是如果我删除“setWebChromeClient”,我该如何获取进度? - Michael
2
请稍等,我将发布我的代码,现在它可以加载URL。 - BNK
1
@confile:您可以看到我的代码,只是做了一些小的更改。 - BNK
显示剩余21条评论

0

这可能解决您的问题:

webView.post(new Runnable() {
    @Override
    public void run() {
        webView.loadUrl(url);
    }
});

0

我遇到了同样的问题。将 WebView 的 useWideViewPort 属性设置为 true 可以解决这个问题。

WebView#getSettings().setUseWideViewPort(true);

0

以下两个解决方案可能会对您有所帮助。

  1. 交叉检查您是否已在AndroidManifest.xml中添加了Internet权限

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

  2. 如果您正在使用模拟器,请检查互联网是否正常工作。 如果不是,则可以尝试清除模拟器的数据并检查。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接