2014-01-23 17 views
1

我正在使用ActionBarSherlock,當用戶做某些事情時,我需要更改操作欄上的一些圖標。爲了我必須保存以便將來使用操作欄:Android - 將接口放入Bundle

private Menu actionBarMenu; 

... 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    MenuInflater inflater = getSupportMenuInflater(); 
    inflater.inflate(R.menu.map_activity_menu, menu); 
    actionBarMenu = menu; 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    actionBarMenu.findItem(R.id.follow_my_position).setIcon(R.drawable.toolbar_myposition_active); 
} 

好吧!這是問題出現的地方。當我旋轉的屏幕上,我得到actionBarMenuNullPointerException
我知道......我沒有保存它旋轉屏幕之前,因此通常我會去onSaveInstanceState和保存我的菜單出現,除了actionBarMenu是一個接口...更具體地說,接口COM .actionbarsherlock.view.Menu我不能修改它,以便它實現Parcelable或Serializable。

那麼如何保存包中的接口?

回答

0

你不能。但是,您仍然可以通過將下面的代碼添加到您的活動

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Object last = getLastNonConfigurationInstance(); 
    if (last != null && last instanceof Menu) { 
     actionBarMenu = (Menu) last; 
    } 
} 

// for FragmentActivity it is onRetainCustomNonConfigurationInstance 
public Object onRetainNonConfigurationInstance() { 
    return actionBarMenu; 
}; 
+1

不是這是從前一個活動的菜單的引用,而不是在重新創建(當前)的菜單中的菜單? – Kuffs

+0

哦,是的,它會。我沒有確切地閱讀這個問題,並認爲你正在試圖保留任何不依賴於你的「活動」的定製類。我的錯。 – Thrakbad

+0

找不到任何叫做'onRetainCustomNonConfigurationInstance()'的方法,但是我發現'onRetainNonConfigurationInstance()',它工作得很好。謝謝:) – Mehdiway

0

你不知道。您不保存界面。 您保存一些字符串或布爾值或整數,表示用戶所做的操作。 然後您檢查該值並再次更改菜單。

+0

嗯,這就是問題所在,我必須保存整個菜單,因爲我無法實例化它。 – Mehdiway

1

你不應該在配置更改保持參照你的動作條上保留取向改變你的成員變量。屏幕旋轉後,Android將重新創建您的活動,所有UI參考應該被釋放,否則您將引入參考泄漏。

爲什麼不在活動旋轉後再次在布爾onCreateOptionsMenu中獲取actionBarMenu引用?

0

這是否在旋轉之前工作?因爲旋轉只會重新創建整個活動 - 即它會再次執行整個創建過程。所以,我不確定娛樂是否是你的問題,因爲無論如何onCreateOptionsMenu(Menu menu);應該被再次調用。

您確定您的actionBarMenu.findItem(R.id.follow_my_position)返回正確嗎?而不是處理它如何當前 - 爲什麼不只是...不存儲菜單,並檢查點擊菜單項呢?

例如:

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch(item.getItemId()){ 
     case R.id.follow_my_position: 
      item.setIcon(R.drawable.toolbar_myposition_active); 
    } 
} 

,或者如果這不是你要找的內容,請檢查您則findItem()調用找到的項目:

MenuItem item = actionBarMenu.findItem(R.id.follow_my_position); 
if(item != null){ 
    item.setIcon(R.drawable.toolbar_myposition_active); 
}