2013-04-13 73 views
1

我正在編寫一個應用程序,它有一個帶按鈕和圖像的菜單。我按下按鈕並且按鈕的標籤從「記錄軌道」變爲「停止記錄」。問題是當我旋轉我的設備時,帶按鈕的活動被操作系統殺死。所以,我明白我必須在我的數據在onSaveInstanceState方法死亡之前保存我的數據,然後在我的onCreate方法中恢復它。事情是這樣的:設備旋轉後恢復已更改的菜單狀態

@Override 
public void onSaveInstanceState(final Bundle saveInstanceState) { 
    saveInstanceState.putSerializable("image", image); 
    saveInstanceState.putSerializable("buttonState", isRecording); 

} 

和:

if (savedInstanceState != null) {         
    isRecording = savedInstanceState.getBoolean("buttonState"); 

    if (menu != null) {           
     MenuItem recordButton = menu.getItem(R.id.track); 

     if (!isRecording) { 
      recordButton.setTitle(R.string.rec_track_label);  
     } else { 
      recordButton.setTitle(R.string.stop_rec_track_label); 
     } 
    }                

    Image = (Image)savedInstanceState.getSerializable("image"); 

} 

雖然它完全恢復我的形象,我還是有問題的菜單:由於某種原因,它始終保持「零」,所以它永遠不會盡管它應該每次都重新創建我的按鈕更改標籤,當活動開始,我把它保存在我的活動的私有對象:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    new MenuInflater(this).inflate(R.menu.actions, menu); 
    this.menu = menu; 
    return (super.onCreateOptionsMenu(menu)); 
} 

任何想法,我究竟做錯了什麼?謝謝。

+1

只是好奇:你的'if(isRecording)'陳述似乎是顛倒的;你爲什麼要設置'stop_rec_track_label'文本,如果它不錄製? – eightx2

+0

@ eightx2你是對的,這是一個錯誤: -/ –

回答

2

你應該將你的menu != null塊到onPrepareOptionsMenu

public boolean onPrepareOptionsMenu(Menu menu) 
{ 
    MenuItem recordButton = menu.findItem(R.id.track); 

    if (isRecording) { 
     recordButton.setTitle(R.string.rec_track_label);  
    } else { 
     recordButton.setTitle(R.string.stop_rec_track_label); 
    } 
} 

由於這種方法被稱爲正在顯示給用戶的菜單直接之前。

+0

你應該使用''menu.findItem(R.id.track);''而不是''menu.getItem(R.id.track);' '。 – makovkastar

+0

@makovkastar - 修好了,謝謝! – ianhanniballake