2013-04-13 50 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