有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android WebView不加载URL?

我有一个Android WebView,它应该加载以下URL:

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:安卓="http://schemas.安卓.com/apk/res/安卓"
                xmlns:tools="http://schemas.安卓.com/tools"
                安卓:layout_width="match_parent"
                安卓:layout_height="match_parent"
                安卓:background="@安卓:color/holo_orange_light"
                tools:context=".MainActivityFragment">



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


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

    <TextView
        安卓:id="@+id/titleView"
        安卓:text="@string/hello_world"
        安卓:layout_width="wrap_content"
        安卓: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 安卓:name="安卓.permission.INTERNET" />
    <uses-permission 安卓:name="安卓.permission.READ_PHONE_STATE" />
    <uses-permission 安卓:name="安卓.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission 安卓:name="安卓.permission.GET_ACCOUNTS" />
    <uses-permission 安卓:name="安卓.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)

共 (6) 个答案

  1. # 1 楼答案

    如果需要,可以尝试使用不确定进度条示例并删除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;
    }
    

    }

  2. # 2 楼答案

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

    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;
        }
    }
    

    我已经使用了您的全部代码,这里是我的web视图结果。我想可能是因为我试图在手机的网络浏览器中打开你的两个URL,所以该网站还没有移动就绪(仍在加载…)

    enter image description here

  3. # 3 楼答案

    第一个问题是您必须交换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是免费生成的

    是吗

    @+id/progressBar
    

    IDE将自动生成一个新ID,该ID与您指的要在上面布局的WebView的ID不同。在ProgressBar声明中,再次使用@+id/ProgressBar,它将重新生成另一个id

    因此,您的WebView在上面被布局为空,您甚至看不到WebView,它可能会加载URL,而您就是看不到它

    祝你好运

  4. # 4 楼答案

    这可能会解决您的问题:

    webView.post(new Runnable() {
        @Override
        public void run() {
            webView.loadUrl(url);
        }
    });
    
  5. # 5 楼答案

    你的URL是https,所以是ssl问题

    您可以在other question中找到解决方案

    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
        }
    });
    
  6. # 6 楼答案

    我也遇到了同样的问题。将useWideViewPort从WebView的设置设置设置为true修复了该问题。 WebView#getSettings().setUseWideViewPort(true);