HTML テキスト入力がほとんどない WebView を含むポップアップ ウィンドウを表示しようとしています。最初の入力ボックスにフォーカスすると、キーボードが表示され、すべて問題ありません。次の入力ボックスにフォーカスしようとすると、以下の例外でアプリがクラッシュします。
01-21 20:31:19.736: W/System.err(14374): android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@2a54119c is not valid; is your activity running?
01-21 20:31:19.737: W/System.err(14374): at android.view.ViewRootImpl.setView(ViewRootImpl.java:562)
01-21 20:31:19.737: W/System.err(14374): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:272)
01-21 20:31:19.737: W/System.err(14374): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
01-21 20:31:19.737: W/System.err(14374): at android.widget.PopupWindow.invokePopup(PopupWindow.java:1058)
01-21 20:31:19.737: W/System.err(14374): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:887)
01-21 20:31:19.737: W/System.err(14374): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:851)
01-21 20:31:19.737: W/System.err(14374): at com.android.org.chromium.content.browser.input.HandleView.showContainer(HandleView.java:176)
01-21 20:31:19.737: W/System.err(14374): at com.android.org.chromium.content.browser.input.HandleView.show(HandleView.java:190)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.content.browser.input.InsertionHandleController.showHandleIfNeeded(InsertionHandleController.java:191)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.content.browser.input.InsertionHandleController.showHandle(InsertionHandleController.java:67)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.content.browser.ContentViewCore$10.showHandle(ContentViewCore.java:2067)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.content.browser.input.InsertionHandleController.onCursorPositionChanged(InsertionHandleController.java:91)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.content.browser.ContentViewCore.onSelectionBoundsChanged(ContentViewCore.java:2557)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:28)
01-21 20:31:19.738: W/System.err(14374): at android.os.Handler.dispatchMessage(Handler.java:102)
01-21 20:31:19.738: W/System.err(14374): at android.os.Looper.loop(Looper.java:135)
01-21 20:31:19.738: W/System.err(14374): at android.app.ActivityThread.main(ActivityThread.java:5223)
01-21 20:31:19.738: W/System.err(14374): at java.lang.reflect.Method.invoke(Native Method)
01-21 20:31:19.738: W/System.err(14374): at java.lang.reflect.Method.invoke(Method.java:372)
01-21 20:31:19.738: W/System.err(14374): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
ここのスタック オーバーフローと Web で同様の問題が報告されているのを見たことがあります。奇妙な点は、この問題が Android 4.4 以降を実行しているデバイスでのみ発生することです。4.3、4.2 などで動作します。デバイスで実行されている PopupWindow で EditText にフォーカスするときに例外が提供される提案に従いましたが、どれも機能しません。ダイアログでは不可能な画面上の特定の場所にポップアップウィンドウを配置したいので、ポップアップの代わりにダイアログを使用できません。自動提案をオフにする、autocomplete="off"、autocorrect="off" などの入力要素に追加の属性を追加するなど、他のすべての提案も試しましたが、どれも機能しませんでした。
私が気づいたもう 1 つのことは、2 つのテキスト ボックスの間に他のタイプの HTML 要素がある場合、たとえばドロップダウンの場合、最初の入力要素からドロップダウンに移動し、次の入力要素に移動してもクラッシュしないことです。アプリであり、正常に動作します。基本的に、キーボードが Android 4.4 以降の最初の入力ボックスによって表示されると、ポップアップ ウィンドウのトークン マネージャーがトスになります。どうすればこれを解決できますか? Android 4.4 以降のバグですか? もしそうなら、回避策はありますか?
コード :
public class MainActivity extends Activity {
private PopupWindow pw;
View contentView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
contentView = inflater.inflate(R.layout.popup, null, false);
pw = new PopupWindow(contentView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
loadContentView(contentView);
}
public void showPopUp(View view){
pw.showAtLocation(contentView, Gravity.CENTER, 10, 10);
}
public void loadContentView(View view){
WebView mWebView = new WebView(this);
mWebView.loadUrl("file:///android_asset/test.html");
LinearLayout ll = (LinearLayout)view.findViewById(R.id.contentLayout);
ll.addView(mWebView);
}
}
ポップアップ レイアウト
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:orientation="vertical">
<LinearLayout
android:id="@+id/contentLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" android:background="#00ff00"/>
</LinearLayout>
HTML
<html>
<head>
<meta name=viewport content="width=device-width, initial-scale=1">
</head>
<body>
<h1 style="color:blue">This is a heading</h1>
<p style="color:red">This is a paragraph.</p>
first text ::<input type="text" autocorrect="off" autocapitalize="off" autocomplete="off"/>
second text ::<input type="text" autocorrect="off" autocapitalize="off" autocomplete="off"/>
</body>
</html>