Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我不能在onPageStarted、onReceivedError或onPageFinished上使用Android WebView进行调用吗?_Android_Webview - Fatal编程技术网

为什么可以';我不能在onPageStarted、onReceivedError或onPageFinished上使用Android WebView进行调用吗?

为什么可以';我不能在onPageStarted、onReceivedError或onPageFinished上使用Android WebView进行调用吗?,android,webview,Android,Webview,我希望能够识别错误发生的时间,并告诉他们显示带有错误的toast消息,但我永远无法让他们打电话。 我还希望能够告诉webview何时开始导航到url,并检测它将要导航到哪个url 不幸的是,它似乎忽略了一切,我不知道一旦发生这种情况,如何启动函数或方法或任何事情。我并不真正关心如何确定何时开始加载页面或发生错误,我只需要一种有效的方法 public class MainActivity extends AppCompatActivity { private WebView myWebView;

我希望能够识别错误发生的时间,并告诉他们显示带有错误的toast消息,但我永远无法让他们打电话。 我还希望能够告诉webview何时开始导航到url,并检测它将要导航到哪个url

不幸的是,它似乎忽略了一切,我不知道一旦发生这种情况,如何启动函数或方法或任何事情。我并不真正关心如何确定何时开始加载页面或发生错误,我只需要一种有效的方法

public class MainActivity extends AppCompatActivity {

private WebView myWebView;

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

        myWebView = (WebView) findViewById(R.id.webview);

       myWebView.setWebViewClient(new WebViewClient());
       myWebView.setWebChromeClient(new WebChromeClient()
        {

            private boolean error;


            public void onPageStarted(WebView view, String url, Bitmap favicon) {

                onPageStarted(view, url, favicon);
                Toast.makeText(getApplicationContext(), "page started:" + url, Toast.LENGTH_SHORT).show();
                error = false;
            }


            public void onReceivedError( WebView view, int errorCode, String description, String failingUrl)  {

                error = true;
                System.out.println("description error" + description);
                view.setVisibility( View.GONE );
                Toast.makeText(getApplicationContext(), "error:" + description, Toast.LENGTH_SHORT).show();
            }


            public void onPageFinished(WebView view, String url) {

                if (!error) {
                    view.setVisibility( View.VISIBLE );
                }
                error = false;

                Toast.makeText(getApplicationContext(), "page finished" + url, Toast.LENGTH_SHORT).show();
            }
        }
        );





        myWebView.setBackgroundColor(0);
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setDefaultTextEncodingName("utf-8");
        webSettings.setJavaScriptEnabled(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setAllowFileAccess(true);


        // Other webview settings
        myWebView.addJavascriptInterface(new MyJavascriptInterface(this), "Android");

        myWebView.loadUrl("https://example.com/");



    }

}
中未定义
onPageStarted()
onPageFinished()
onReceivedError()
方法。他们是俱乐部的成员。你子分类错了

如果您在每个方法上方添加
@Override
注释,您的IDE应该大声告诉您这些方法不会覆盖超类中的任何内容,这就是为什么该注释很有用的原因

只需将这些覆盖移动到
WebViewClient
实例

myWebView.setWebViewClient(new WebViewClient() {
        private boolean error;

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            ...
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            ...
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            ...
        }
    }
);

myWebView.setWebChromeClient(new WebChromeClient());

覆盖那些有意义的方法。WebChromeClient是否有其他方法?我试图寻找一些,但我能找到的最接近的东西是onProgressChanged,我真的需要找到一些错误。好吧,你可以使用
onProgressChanged()
,效果与
onPageStarted()
onPageFinished()
相同,但这并不是真的必要。您所需要做的就是将整个方法块移动到另一个对象;i、 例如,将其移到
new WebViewClient()
的末尾。非常感谢。出于某种原因,我认为WebViewClient是WebChromeClient的替代品,而不是它们一起工作。不,它们是独立的东西,您可以同时使用它们。我从来没有真正弄明白他们为什么使用两个不同的类,但这就是生活。干杯