当前位置: 首页 > 知识库问答 >
问题:

旋转设备后恢复更改的菜单状态

壤驷阳冰
2023-03-14

我正在编写一个应用程序,它有一个带有按钮和图像的菜单。我按下按钮,按钮的标签从“录制曲目”更改为“停止录制”。问题是,当我旋转设备时,带有按钮的活动会被操作系统终止。因此,我知道我必须在数据在onSaveInstanceState方法中被杀死之前保存数据,然后在我的onCreatemethod中恢复数据。类似这样:

@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个答案

吕英豪
2023-03-14

你应该移动你的< code >菜单!= 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);
    }
}

因为这个方法是在菜单显示给用户之前直接调用的。

 类似资料:
  • 我有一个聊天应用程序,可以打开一个到服务器的Websocket。该应用程序有2个模块- chat sdk:处理连接和来回消息传递。 用户界面:处理适配器和视图 聊天UI位于活动托管的片段上。 一切都很好,但当我决定在设备旋转上使用持久性时,我遇到了问题。当我旋转设备时,websocket重新连接(这是正常的),活动被重新创建,片段也被重新创建。 经过设备旋转和一些调试,我看到我的消息列表被正确填充

  • 实现类似转盘电话中拨号转盘的旋转菜单效果。滑动菜单,菜单进行转动,转动的过程中,处于最前面的按钮按钮慢慢变大,处于后端的按钮变小。同样,点击转盘菜单上某个按钮,被点击的按钮会慢慢被转到最前面。由于转动的过程中,按钮会有大变小或者由小变大,所以这个动画有3D的效果。 [Code4App.com]

  • 我使用Apache Flink 1.9和标准检查点/保存点机制来FS。 我的问题是:如果作业的代码发生了更改,从保存点恢复作业的正确方法是什么?例如,在重构之后,我重命名了几个类,之后我无法从旧的检查点恢复。 我丢失了我的数据,想问-在这种情况下我能做些什么? 所有运算符都有uid和name

  • 在需要动态添加和从viewpager中删除列表片段的应用程序中工作,当点击列表中的一个项目时,新的片段会添加到viewpager中,当需要删除swipe back片段时,这工作效果很好,但当我旋转屏幕时,页面中的片段会有两个实例,再旋转一次,实例会增加四倍。 同时,我需要持久化片段的状态(列表位置、加载的项数等),这意味着重写片段中的onsaveinstancestate并将相关数据保存在捆绑包中

  • 我制作了一个recyclerview网格,一旦用户按下按钮,它就会被api中的数据填满。旋转屏幕后,滚动位置会短暂恢复,然后再向上滚动到网格顶部。我使用本教程来保留我的滚动位置: 我还在本教程中尝试保存布局状态。 我的舱单条目是:

  • 我有一个插入符号指向我的导航项目,一旦点击导航项目,它会显示下拉框,旋转插入符号180并向上指向。唯一的问题是当你点击另一个导航项目时,它隐藏了下拉列表,但插入符号仍然指向上方。这是我用的JavaScript 单击另一导航项后,是否有方法将插入符号旋转回指向下方?