アクティビティの 1 つでオプション メニューを使用すると、奇妙な動作が発生しました。ユーザーがアクティビティから離れて (ただし、アクティビティを終了せずに) 戻ってからオプション メニューを呼び出すと、アプリがIllegalStateException
. 例外は、アクティビティを終了する前にメニューが表示された場合にのみスローされます。私のコードがこれを引き起こしているわけではないようです。アクティビティはListActivity
. そもそも自分Adpater
が原因かと思ったのですが、例外はオプションメニュー(パネル)を作成する内部構造にあります。
さらに奇妙なことに、これはすべてのデバイスで発生しているわけではありません。現在、Android 4.0.3 を搭載した HTC Sensation でのみ再現できます。
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:3345)
at android.view.ViewGroup.addView(ViewGroup.java:3216)
at android.view.ViewGroup.addView(ViewGroup.java:3196)
at com.android.internal.policy.impl.PhoneWindow.openPanel(PhoneWindow.java:614)
at com.android.internal.policy.impl.PhoneWindow.onKeyUpPanel(PhoneWindow.java:884)
at com.android.internal.policy.impl.PhoneWindow.onKeyUp(PhoneWindow.java:1557)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1884)
at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3407)
at android.view.ViewRootImpl.handleFinishedEvent(ViewRootImpl.java:3380)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2523)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4945)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
オプション メニューの作成は非常に基本的なものに見えます (私の他のすべてのアクティビティと同じで、問題はありません)。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.message_thread, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem item = menu.findItem(R.id.menuItemToContacts);
// enable/disable some items ...
return true;
}
対応する menu.xml は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menuItemSettings"
android:icon="@drawable/ic_menu_einstellungen"
android:title="@string/settings">
</item>
<!-- some more elements in the exact same style -->
</menu>
私はすでに多くのことを試しました(特にメニューの作成と準備)。最大の問題は、例外が発生しているため、例外をどこにもキャッチできないことView
です。
ヒントと可能な回避策は非常に高く評価されています!!1!
私Adapter
は実際にいくつかのビューを行っていますが、ビューの追加には注意を払っていると思います。さらに、例外には私のクラスへのトレースが含まれていないため、これが本当にアダプターに起因するものであるかどうかは疑わしいです。
private class ViewHolder {
public LinearLayout stateList;
// more view elements
}
private class ChildContainer {
public void bind(ViewHolder holder) {
// prepare listeners and save reference to holder
}
/**
* Populates the view
*/
private void fillStateLists() {
// ...
if (convertView == null) {
try {
this.holder.stateList.addView(view);
} catch (IllegalStateException e) {
if (view.getParent() instanceof ViewGroup) {
((ViewGroup) view.getParent()).removeView(view);
}
this.holder.stateList.addView(view);
}
}
}
}
MyViewHolder
はAdapter
sで呼び出されますbindView()
:
final ViewHolder holder = (ViewHolder) view.getTag();
final long viewID = getItemId(cursor.getPosition());
final ChildContainer child = this.childContainers.get(viewID);
child.bind(holder);