WebViewを表示した際に、画面を長押しするとクラッシュするという事象が発生したので、対応をまとめました.
事象が発生するオペレーション
1.WebViewを開く.
2.WebView内のどこかの場所を長押しする.
3.クラッシュする.
明らかにバグのよう.発生するのはAndroid5.0 Lollipopから.
公式のバグチケットを見ても特に解決していない様子.
回避方法
1.WebViewのLongClickを抑止する.
LongClick用のリスナーを作り、エラーを発生させているSupportLibraryのメソッドまでクリックイベントを伝えなければよい.
1 2 3 4 5 6 7 8 |
mWebView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { Log.d(TAG, "LONG CLICKED"); return true;//ここでtrueを返すことによりイベントの伝播を防ぐ } }); |
ちなみに、ロングクリックの無効化では クラッシュを防げませんでした.
webView.setLongClickable(false);
おそらく、webView自体のロングクリックは発生しなくても、その後SupportLibraryにイベントが伝わってしまうからのようです.
2.SupportLibraryを利用しない.
SupportLibraryのActionBarActivityに問題があるようなので、これを直すか、SupportLibraryを利用しないようにすることでも回避可能.
エラーログ
12-20 01:15:33.630: E/AndroidRuntime(20356): java.lang.UnsupportedOperationException: This is not supported, use MenuItemCompat.getActionProvider()
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.view.menu.MenuItemImpl.getActionProvider(MenuItemImpl.java:634)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.view.menu.MenuItemWrapperICS.getSupportActionProvider(MenuItemWrapperICS.java:322)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.view.menu.MenuItemWrapperICS.checkActionProviderOverrideVisibility(MenuItemWrapperICS.java:348)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.view.menu.MenuItemWrapperICS.setVisible(MenuItemWrapperICS.java:183)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.view.SupportMenuInflater$MenuState.setItem(SupportMenuInflater.java:425)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.view.SupportMenuInflater$MenuState.addItem(SupportMenuInflater.java:479)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.view.SupportMenuInflater.parseMenu(SupportMenuInflater.java:196)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.view.SupportMenuInflater.inflate(SupportMenuInflater.java:118)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.webkit.SelectActionModeCallback.onCreateActionMode(SelectActionModeCallback.java:47)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onCreateActionMode(SupportActionModeWrapper.java:151)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.app.ActionBarActivityDelegateBase$ActionModeCallbackWrapper.onCreateActionMode(ActionBarActivityDelegateBase.java:1367)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.dispatchOnCreate(WindowDecorActionBar.java:1012)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.app.WindowDecorActionBar.startActionMode(WindowDecorActionBar.java:510)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.app.ActionBarActivityDelegateBase.startSupportActionMode(ActionBarActivityDelegateBase.java:576)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.app.ActionBarActivityDelegateHC.startActionModeForChild(ActionBarActivityDelegateHC.java:62)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.support.v7.internal.widget.NativeActionModeAwareLayout.startActionModeForChild(NativeActionModeAwareLayout.java:44)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:673)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:673)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:673)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:673)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.view.View.startActionMode(View.java:3624)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.webkit.WebView.setUpSelect(WebView.java:5709)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.webkit.WebView.selectText(WebView.java:4640)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.webkit.WebView.selectText(WebView.java:4633)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.webkit.WebView.performLongClick(WebView.java:4618)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.webkit.WebView$PrivateHandler.handleMessage(WebView.java:8687)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.os.Handler.dispatchMessage(Handler.java:99)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.os.Looper.loop(Looper.java:137)
12-20 01:15:33.630: E/AndroidRuntime(20356): at android.app.ActivityThread.main(ActivityThread.java:4424)
12-20 01:15:33.630: E/AndroidRuntime(20356): at java.lang.reflect.Method.invokeNative(Native Method)
12-20 01:15:33.630: E/AndroidRuntime(20356): at java.lang.reflect.Method.invoke(Method.java:511)
12-20 01:15:33.630: E/AndroidRuntime(20356): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
12-20 01:15:33.630: E/AndroidRuntime(20356): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
12-20 01:15:33.630: E/AndroidRuntime(20356): at dalvik.system.NativeStart.main(Native Method)