Android - 未调用 WebView OnPageStarted、OnPageFinished 和 shouldOverrideUrlLoading

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22480531/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 06:02:41  来源:igfitidea点击:

Android - WebView OnPageStarted, OnPageFinished & shouldOverrideUrlLoading not getting called

androidwebview

提问by Mitesh Shah

I am developing an app in that when a user navigates from one link to another link I want to change the content of the edittextand want to show current url in the edittext.

我正在开发一个应用程序,当用户从一个链接导航到另一个链接时,我想更改内容edittext并希望在编辑文本中显示当前 url。

But these 3 methods are not working, not even printing the logs. Here is the code.

但是这 3 种方法不起作用,甚至不打印日志。这是代码。

    wv.setWebViewClient(new WebViewClient()
    {
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {               

            String url_new = view.getUrl();

            Log.v("","Webview URL: "+url);

            addressbar.setText(url_new);

            return false;                            
        }

        @Override
        public void onPageFinished(WebView view, String url)
        {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);

            String url_new = view.getUrl();                

            Log.v("","Webview Function URL: "+url_new);

            addressbar.setText(url_new);
        }

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

            String url_new = view.getUrl();             

            Log.v("","Webview Function URL: "+url_new);

            addressbar.setText(url_new);
        }
    }); 

wvis the WebViewand addressbaris the EditTextin above code.

wvWebViewaddressbarEditText在上面的代码。

What I am missing??

我缺少什么??

Please help..!!

请帮忙..!!

EDIT : Whole Code..

编辑:整个代码..

public class Clip_From_Web_Home extends Activity
 {
WebView wv;

TextView back, clip;
ProgressDialog dialog;

Button previous, reload, next, go;

LinearLayout ll;
public static final int REQUEST_CODE_CROP_IMAGE   = 0x1;
Bitmap drawingCache;

public File mFileTemp;
public static final String TEMP_PHOTO_FILE_NAME = "temp_photo_web_clip.png";
FileOutputStream out;

EditText addressbar;

String url;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.clip_from_web);

    wv = (WebView) findViewById(R.id.clip_from_web_webView1);

    back = (TextView) findViewById(R.id.clip_from_web_textview_back);
    back.setOnClickListener(new OnClickListener()
    {           
        @Override
        public void onClick(View arg0)
        {
            // TODO Auto-generated method stub
            finish();
        }
    });

    url = "http://www.google.com";

    addressbar = (EditText) findViewById(R.id.clip_web_address_bar);
    addressbar.setText(url);

    //wv.getSettings().setJavaScriptEnabled(true);
    wv.setWebViewClient(new WebViewClient()
    {
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {               

            String url_new = view.getUrl();

            Log.v("","Webview URL: "+url);

            addressbar.setText(url_new);

            return false;                            
        }

        @Override
        public void onPageFinished(WebView view, String url)
        {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);

            String url_new = view.getUrl();                

            Log.v("","Webview Function URL: "+url_new);

            addressbar.setText(url_new);
        }

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

            String url_new = view.getUrl();             

            Log.v("","Webview Function URL: "+url_new);

            addressbar.setText(url_new);
        }
    }); 

    go = (Button) findViewById(R.id.clip_web_go);
    go.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View arg0)
        {
            // TODO Auto-generated method stub

            url = addressbar.getText().toString();

            Log.v("","URL ENTERED: "+url);

            if(url.equals(""))
            {
                url = "http://www.google.com";

                dialog = ProgressDialog.show(Clip_From_Web_Home.this,"","Loading",true,false);

                new webview_load().execute();
            }
            else
            {
                dialog = ProgressDialog.show(Clip_From_Web_Home.this,"","Loading",true,false);

                new webview_load().execute();
            }

        }
    });                 

    dialog = ProgressDialog.show(Clip_From_Web_Home.this,"","Loading",true,false);

    new webview_load().execute();   
}   

class webview_load extends AsyncTask<Void, Void, Void>
{

    @Override
    protected Void doInBackground(Void... arg0)
    {
        // TODO Auto-generated method stub              
        return null;
    }

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onPostExecute(Void result)
    {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        wv.setBackgroundColor(0);
        wv.setBackgroundResource(android.R.color.black);
        wv.setWebChromeClient(new WebChromeClient());
        wv.setWebViewClient(new WebViewClient());
        WebSettings settings = wv.getSettings();
        settings.setBuiltInZoomControls(true);
        //settings.setDefaultZoom(ZoomDensity.MEDIUM);
        settings.setDefaultZoom(ZoomDensity.FAR);

         wv.setInitialScale(125);
       // settings.setUseWideViewPort(true);
        settings.setRenderPriority(RenderPriority.HIGH);
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);

        wv.getSettings().setJavaScriptEnabled(true);
        wv.getSettings().setLoadWithOverviewMode(true);
        wv.getSettings().setUseWideViewPort(false);

        wv.loadUrl(url);

        int secondsDelayed = 5;
        new Handler().postDelayed(new Runnable()
        {
                public void run()
                {
                    Log.v("","In Handler");                  
                    dialog.dismiss();
                }
        }, secondsDelayed * 1000);          
    }
}   
}

回答by drdaanger

You're overwriting your WebViewClient in your AsyncTask object:

您正在 AsyncTask 对象中覆盖您的 WebViewClient:

wv.setWebViewClient(new WebViewClient());
wv.setWebViewClient(new WebViewClient());

This overwrites your custom WebViewClient you set in Activity.onCreate().

这会覆盖您在 Activity.onCreate() 中设置的自定义 WebViewClient。

You can probably get rid of the whole AsyncTask implementation, too. You can call loadUrl in a WebView in the UI thread with no problems. This might simplify things for you greatly.

您也可以摆脱整个 AsyncTask 实现。您可以毫无问题地在 UI 线程中的 WebView 中调用 loadUrl。这可能会大大简化你的事情。