1

アクティビティの 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);
        }
        }
    }
}

MyViewHolderAdaptersで呼び出されますbindView():

final ViewHolder holder = (ViewHolder) view.getTag();
final long viewID = getItemId(cursor.getPosition());
final ChildContainer child = this.childContainers.get(viewID);
child.bind(holder);
4

2 に答える 2

1

オプションメニューの作成は問題ないと思います。アダプターコードに存在する可能性があります。

于 2012-10-30T13:03:14.040 に答える
0

なんらかの (愚かな) 理由で、リスト ビューのスクロール位置を保存するためonSaveInstanceStateに呼び出されました。onStop追加onRestoreInstanceStateで呼び出されましたonStart

スーパー実装を調べると、ビュー階層の状態が保存および復元されることがわかります。追加の呼び出しにより、特にオプション パネルで無効な状態が発生した可能性があり、パネルが再び必要になったときに、すべてがバラバラになりました。

これらの呼び出しを削除し、状態の保存が でのみ行われることを確認し、onSaveInstanceStateそれぞれで復元することでonRestoreInstanceState問題が修正されました。

アクティビティのライフサイクルを壊さないでください! ;-)

于 2012-11-01T09:46:53.247 に答える