gpt4 book ai didi

android - 打开选项菜单上的 IllegalStateException

转载 作者:行者123 更新时间:2023-11-30 03:57:17 25 4
gpt4 key购买 nike

我的一个 Activity 中的选项菜单出现了一个奇怪的行为:当用户从 Activity 中导航离开(但没有完成它)然后再次返回然后调用选项菜单时,应用程序崩溃并显示 非法状态异常。仅当菜单在离开 Activity 之前已显示时才会抛出异常。似乎不是我的代码导致了这个。该 Activity 是一个 ListActivity。首先,我认为我的 Adpater 可能会导致此问题,但异常来自创建选项菜单(面板)的内部结构。

更奇怪的是,这并不是在所有设备上都会发生。目前我只能在 HTC Sensation with Android 4.0.3 上重现此内容。

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)

创建选项菜单看起来很简单(和我所有其他 Activity 一样,不会产生任何问题):

@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 中,我实际上做了一些 View 操作,但我认为我在添加 View 时非常小心。此外,异常不包含对我的类的任何跟踪,所以我怀疑它真的是适配器导致的。

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);
}
}
}
}

我的 ViewHolderAdapterbindView() 中被调用:

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

最佳答案

我认为创建选项菜单没有任何问题。它可以在适配器代码中。

关于android - 打开选项菜单上的 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13139547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com