Android 解决IllegalArgumentException: Receiver not registered: android.widget.ZoomButtonsController

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010872619/article/details/78687798
报错原因:
    WebView中包含一个ZoomButtonsController,当使用webVeiw.getSettings().setBuiltInZoomControls(true);启用后,用户一旦触摸屏幕,就会出现缩放控制图标。如果图标自动消失前执行了webVeiw.destroy();,就会报上面的这些异常。

解决方法:
    1、webVeiw.getSettings().setBuiltInZoomControls(false);
    2、在退出activity是不执行webVeiw.destroy(),或者延迟几秒,等ZoomButtonsController缩放控制图标消失了在执行webVeiw.destroy();
    3、在webview中隐藏ZoomButtonsController缩放控制图标;隐藏ZoomButtonsController代码如下:
public class MainActivity extends Activity {
    private WebView webView;

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

        webView = (WebView) findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setSupportMultipleWindows(true);
        webView.getSettings().setBuiltInZoomControls(true); //缩放控制图标 

        webView.loadUrl("www.baidu.net");
        int sysVersion = Build.VERSION.SDK_INT;
        if (sysVersion >= 11) {
            setZoomControlGoneX(webView.getSettings(), new Object[]{false});
        } else {
            setZoomControlGone(webView);
        }
    }

    //通过反射隐藏webview的缩放按钮 适用于3.0和以后  
    public void setZoomControlGoneX(WebSettings view, Object[] args) {
        Class classType = view.getClass();
        try {
            Class[] argsClass = new Class[args.length];

            for (int i = 0, j = args.length; i < j; i++) {
                argsClass[i] = args[i].getClass();
            }
            Method[] ms = classType.getMethods();
            for (int i = 0; i < ms.length; i++) {
                if (ms[i].getName().equals("setDisplayZoomControls")) {
                    try {
                        ms[i].invoke(view, false);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //通过反射隐藏webview的缩放按钮 适用于3.0以前  
    public void setZoomControlGone(View view) {
        Class classType;
        Field field;
        try {
            classType = WebView.class;
            field = classType.getDeclaredField("mZoomButtonsController");
            field.setAccessible(true);
            ZoomButtonsController mZoomButtonsController = new ZoomButtonsController(view);
            mZoomButtonsController.getZoomControls().setVisibility(View.GONE);
            try {
                field.set(view, mZoomButtonsController);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/u010872619/article/details/78687798
今日推荐