美文网首页X5WebViewAndroid技术知识
android webview ZoomButtonsContr

android webview ZoomButtonsContr

作者: kecai | 来源:发表于2017-06-20 11:02 被阅读926次

    最近使用Cordova中 的webview会出现以下报错:
    E/AndroidRuntime(13332): Java.lang.IllegalArgumentException: Receiver not registered: Android.widget.ZoomButtonsController$1@4162fc18

    根据异常信息再参考一下WebView的源码就可以知道ZoomButtonsController有一个register和unregister的过程。但是这两个过程是我们控制不了的,WebView有显示控制的API但我们访问不过。

    很多网上的回答都是在Activity的onDestroy里面加上这么一句:web.setVisibility(View.GONE);把WebView设置为GONE就可以了。

    但是还是会报这样的错误。仔细研究会发现:webview的 ZoomButton的自动隐藏是一个渐变的过程,所以在逐渐消失的过程中如果调用了父容器的destroy方法,就会导致Leaked。
    所以要延迟1s再destroy:
    if(null!=this.appView) {
    if (null != this.appView.getView()) {
    ((WebView) this.appView.getView()).getSettings().setBuiltInZoomControls(true);

                this.appView.getView().setVisibility(View.GONE);
                long  timeout
    

    =ViewConfiguration.getZoomControlsTimeout();

                new Timer().schedule(new TimerTask(){
                    @Override
                    public void run() {
                        try {
                        ((WebView)appView.getView()).destroy();
                        }catch (Exception e){
    
                        }
                    }
                }, timeout+1000L);
            }
        }
    

    一般到这里就会结束了。但是我在CordovaActivity中应用会发现还是没用。那么我们看下是不是在父类中的ondestroy方法里提前把webview设置为GONE。
    果不其然:
    @Override
    public void onDestroy() {
    LOG.d(TAG, "CordovaActivity.onDestroy()");
    super.onDestroy();

        if (this.appView != null) {
            appView.handleDestroy();
        }
    }
    

    那么我们把这段:
    if (this.appView != null) {
    appView.handleDestroy();
    }

    注释掉,移到外面延迟1s执行即可

    相关文章

      网友评论

        本文标题:android webview ZoomButtonsContr

        本文链接:https://www.haomeiwen.com/subject/rysoqxtx.html