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

来源:互联网 发布:网络信息安全科普视频 编辑:程序博客网 时间:2024/06/17 17:50
报错原因:    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();        }    }}
阅读全文
0 0
原创粉丝点击