使用invalidateOptionsMenu()与登录系统(Android)

4

我正在尝试在同一个活动中让我的选项菜单重新绘制,以便调用登录对话框。

以下是设置。用户可以从应用程序的任何活动中,单击溢出/选项菜单,然后单击登录。然后会弹出一个对话框,他们可以希望成功登录。然后,对话框完成 ()。如果您单击菜单,它仍然显示“登录”而不是“注销”。似乎我没有正确使用 invalidateOptionsMenu 吗?下面是代码:

从调用对话框的选项菜单代码:

case R.id.Login:
        Intent i = new Intent(this, Login.class);
        startActivityForResult(i, 0);
        return true;

Login.class是一个对话框。当用户在对话框中点击提交按钮时,会发生以下情况:

       // set log in var's here

        Intent in = new Intent();
        setResult(1, in);
        finish();

然后回到原始活动:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == 1) {

        MyActivity.this.invalidateOptionsMenu();


    }
}

使用Toast,我确认“1”已被调用。如何使菜单失效并重新绘制,以便它将包括注销选项(因为用户现在已登录?)编辑:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    MenuItem Rules = menu.findItem(R.id.Rules);
    MenuItem About = menu.findItem(R.id.About);
    MenuItem Profile = menu.findItem(R.id.Profile);
    MenuItem Login = menu.findItem(R.id.Login);
    MenuItem Logout = menu.findItem(R.id.Logout);

    // set the menu options depending on login status
    if (LoggedStatus == true) {
        // show the log out option
        Logout.setVisible(true);
        Login.setVisible(false);

        Rules.setVisible(true);
        Profile.setVisible(true);
        About.setVisible(true);
    } else {
        // show the log in option
        Logout.setVisible(false);
        Login.setVisible(true);

        Rules.setVisible(true);
        Profile.setVisible(false); // hide
        About.setVisible(true);
    }

    return true;
}

你在哪个操作系统上测试这个?而且,你是否使用了支持包ActionBarSherlock...? - Cat
你期望发生什么?你有一个名为“登录”的菜单项。除非你改变它,隐藏它,禁用它或删除它,否则它将会显示出来。 - Falmarri
我有一个 onPrepareOptionsMenu() 方法,在这里我做了这件事。我只是不想显示所有的代码。我想知道我是否在使用无效的代码范围? - TheLettuceMaster
你能发布你的onPrepareOptionsMenu()代码吗?我没有看到你发布的代码中有任何明显的问题。也许在调用super.onActivityResult(..)之前,可以将结果检查放置在onActivityResult(..)中? - Alex Curran
@Espiandev 嗯...我按照你说的交换了两个,但没有任何区别。我在问题中添加了onPrep方法。 - TheLettuceMaster
2个回答

4
我会仔细研究这个链接:http://developer.android.com/guide/topics/ui/menus.html#ChangingTheMenu 在Android 3.0+上调用invalidateOptionsMenu()将调用onPrepareOptionsMenu()。该方法接收一个Menu对象,您可以使用该对象对菜单进行更改,无论是添加还是删除菜单项。
记住onPrepareOptionsMenu()需要返回true,才能显示菜单;如果返回false,则不会显示。
编辑:抱歉,我不知怎么错过了最底部的代码。让我快速检查一下。
编辑2:您忘记了调用super.onPrepareOptionsMenu(menu); 编辑3:既然确定菜单可以正常工作,那么唯一可能导致它没有显示的原因就是LoggedStatus。确保它被正确修改应该解决所有问题。

1
@KickingLettuce 你试过我的建议了吗?加上对super的调用?如果没有,该方法将不会使用任何Android内部代码,基本上什么也不会做,这是你代码中唯一看起来有问题的地方。一旦确定它正在更新,我会担心LoggedStatus的事情。 - telkins
我没有注意到那个编辑,抱歉。我相信自从我提出这个问题后,我已经包含了它,尽管在我最近的代码中,我有“return super.onPrepareOptionsMenu(menu);”。经过进一步的思考,我不确定为什么我这样做。使用你的代码,这是放在所有其他代码之前还是之后? - TheLettuceMaster
1
@KickingLettuce 我会尝试像这个SO答案那样做:https://dev59.com/U2855IYBdhLWcg3wsWhq - telkins
好的,我会在能够测试应用程序时尝试这些建议,并希望很快能够标记为正确! - TheLettuceMaster
好的,我已经弄清楚了,显然invalidateOptionsMenu()是正常工作的。但是LoggedStatus变量没有被改变。我只需要在使其无效之前进行一个新的调用/引用变量,它就可以很好地工作了。如果您想将您的答案针对这个解决方案进行调整,我会给您+100分,并标记为正确答案,否则我会自己回答。再次感谢! - TheLettuceMaster
显示剩余4条评论

-2

@KickingLettuce

将其转换为MenuItem类型。Android无法确定“setVisible”是否适用于“Rules”变量或者能否调用它。

MenuItem Rules = (MenuItem) menu.findItem(R.id.Rules);

这样做应该可以解决问题。希望有所帮助 :)


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