您的位置:首页 > 移动开发 > Android开发

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

2017-12-01 16:10 645 查看
报错原因:
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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  webview android ZoomButton
相关文章推荐