2012-10-30 139 views
1

我在其中一個活動中使用選項菜單時出現了一個奇怪的行爲:當用戶從活動中導航(但未完成)並再次返回,然後調用選項菜單時,應用程序崩潰與IllegalStateException。只有在離開活動之前顯示菜單時纔會拋出異常。 看來,不是我的代碼造成這種情況。該活動是一個ListActivity。首先,我認爲我的Adpater可能會導致這種情況,但例外來自創建選項菜單(面板)的內部。IllegalStateException打開選項菜單

爲了讓思想變得更偉大,這並不是所有設備上都會發生的。目前我只能在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冒泡。

提示和可能的工作回合是非常apprechiated !! 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); 
     } 
     } 
    } 
} 

ViewHolder被調用的Adapter小號bindView()

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

回答

0

對於一些(愚蠢的)原因onSaveInstanceStateonStop中被調用來保存列表視圖的滾動位置。另外onRestoreInstanceState被叫做onStart

看一下超級實現就會發現視圖層次結構狀態得到保存和恢復。額外的電話會導致無效的狀態,特別是對於選項面板,當面板再次需要時,所有事情都會崩潰。

刪除這些調用,並確保保存我的狀態只發生在onSaveInstanceState,並在onRestoreInstanceState修復該問題。

絕不會破壞Activity的生命週期! ;-)

1

我覺得沒有在創建選項菜單中的任何問題。它可以在適配器代碼中。

+0

其實我做了一些視圖 - 在適配器中添加(見編輯)。但我確實發現了'IllegalStateException'。此外,我期望這個異常會包含一些跟我的類相關的痕跡。 – Brian

+0

你正在從持有人蔘考持有人通常持有人是kep作爲標籤上的convertView。在你的代碼中檢查這個。 –

+0

我想這是更復雜;-) 持有人來自視圖標記。列表中的每個元素都有一個'ChildContainer',它存儲在'LongSparseArray'中。 – Brian

相關問題