Android菜单在每次应用程序运行时只能使用一次

4
我遇到了一个奇怪的问题,我的Android应用程序出现了故障。我的主活动附带有一个菜单,可以通过菜单按钮进行访问。然而问题是,菜单按钮仅能正常工作一次,按下按钮后,必须重新启动应用程序才能再次使用菜单按钮。
(已清理的)代码如下:
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.main);

    settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    startActivity(new Intent(this, PreferencesActivity.class));

    return(super.onCreateOptionsMenu(menu));
}

@Override
public void onBackPressed() {
    this.finish();
}

@Override
public void onDestroy() {
    super.onDestroy();
    this.finish();
}

@Override
public void onStop() {
    super.onStop();
    this.finish();
}

首选项活动看起来像这样

public class PreferencesActivity extends PreferenceActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

        addPreferencesFromResource(R.xml.preferences);
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onStop() {
        super.onStop();
        this.finish();
    }

    @Override
    public void onBackPressed() {
        this.finish();
    }
}

有什么建议可以解决这个问题吗?

谢谢先(TIA)。

3个回答

5

onCreateOptionsMenu只会在首次打开选项菜单前被调用一次。相反,应该使用onPrepareOptionsMenu来调用你的startActivity(new Intent(this, PreferencesActivity.class));
每次点击菜单按钮时,都会调用onPrepareOptionsMenu

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    startActivity(new Intent(this, PreferencesActivity.class));
    return super.onPrepareOptionsMenu(menu);
}

你能详细说明一下吗?不确定你指的是 onPrepareOptionsMenu 需要放在哪里。 - user1174838
你必须在你的Activity类中重写onPrepareOptionsMenu方法,就像你之前用onCreateOptionsMenu一样。我已经更新了我的答案来展示给你代码。 - Thommy
这似乎对于主活动有效,但对于子活动无效。当我在子活动中按菜单按钮,然后按返回按钮时,我会回到主活动,而不是我所在的子活动??? - user1174838
不明白问题出在哪里。在第二个活动中按返回键应该会带您回到主活动。 - Thommy
啊,我的子活动在onPause()中有this.finish()。我将其注释掉,现在似乎可以工作了。感谢您的帮助。 - user1174838

1
问题在于您正在启动一个Activity而不是显示菜单。 通常的方法是在onCreateOptionsMenu中填充菜单,并在此菜单中有一个设置项,如果按下,则显示Preference Activity。
Thommy是正确的。如果您想立即启动preference Activity(请记住,这对于Android应用程序来说是不寻常的行为),则可以在onPrepareOptionsMenu中执行此操作。 在正常流程中,菜单在onCreateOptionsMenu回调中创建一次,之后被重复使用。

我的应用程序有几个活动。初始活动有一个菜单(在/res/xml/preferences.xml中实现),其中一个子活动也是如此实现。我希望当按下菜单按钮时,显示适当的菜单,并且当按下返回按钮时,再次显示调用活动。用户应该能够根据需要多次访问菜单。 - user1174838
谢谢提供信息。我需要去阅读一些相关内容。 - user1174838

0
点击菜单按钮后,您将转到PreferencesActivity,无论何时您再次单击返回按钮...由于onBackPressed方法,第一个活动将关闭。
您能告诉我您具体在寻找什么吗?

你想在所有的活动中使用相同的菜单选项吗?请尝试在所有的方法中移除this.finish()并将onCreateOptionsMenu方法的名称更改为onPrepareOptionsMenu。 - Pavandroid
没有。主活动有一个菜单选项,可以启用或禁用应用程序的“演示”模式。只有一个子活动有一个菜单,它可以影响该活动的工作方式。 - user1174838
OnCreateOptionsMenu菜单是Activity特定的,不能被激活/继承到下一个Activity。如果您希望在其他Activity中激活菜单,则应该再次为该特定Activity单独创建选项菜单。 - Pavandroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接