android - 试图在 Android 中隐藏菜单项,但行为不符合预期

标签 android menu

我创建了以下菜单项,并且始终显示为一个操作,而不是隐藏在溢出菜单中。

<item android:id="@+id/menu_refresh_network"
    android:orderInCategory="100"
    android:icon="@drawable/ic_menu_action_refresh_network"
    android:title="@string/title_refresh_network"
    android:enabled="true"
    app:showAsAction="always" />

ThreshVoteIntentService.mOpportunisticTRUE 时,我需要隐藏它。我有一个接收器,当该值发生变化时,它会按 Intent 发出警报。这是使菜单无效的一个非常简单的过程。

IntentFilter filterModeUpdated = new IntentFilter(resources.getString(R.string.action_mode_updated));
mModeUpdatedReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        invalidateOptionsMenu();
    }
};

this.registerReceiver(mModeUpdatedReceiver, filterModeUpdated);

我有我的选项菜单,然后(据说)在 onPrepareOptionsMenu 中重绘。

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
    menu.findItem(R.id.menu_refresh_network).setVisible(ThreshVoteIntentService.mOpportunistic);

    return super.onPrepareOptionsMenu(menu);
}

实际情况menu_refresh_network 的可见性仅在我打开溢出菜单时发生变化。我是否基本上误解了它应该如何工作?

最佳答案

onPrepareOptionsMenu() 只在显示溢出菜单之前被调用,所以为时已晚。

您需要在正确的 MenuItem 上调用 setVisible(false) before 使选项菜单无效。因此,在您的 onCreateOptionsMenu() 中,使用 findItem() 找到对 MenuItem 的引用对于要更改的项目 ID 并将其存储在成员变量中。然后,当广播到达时,更改该项目的可见性,然后使选项菜单无效。

这是一个示例 Activity ,它基于我在 Android Studio 中创建的一个新项目来演示这一点。如果你运行这个,你可以看到菜单项在 5 秒后消失,甚至不需要 invalidate 来强制刷新菜单。

public class MainActivity extends AppCompatActivity {

    private MenuItem menuItem;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Hide the menu item in 5 seconds
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                menuItem.setVisible(false);
            }
        }, 5000);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);

        menuItem = menu.findItem(R.id.action_settings);
        MenuItemCompat.setShowAsAction(menuItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);

        return true;
    }

}

关于android - 试图在 Android 中隐藏菜单项,但行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35532083/

相关文章:

html - Chrome 浏览器中的菜单不同

android - 我在哪里可以获得 Android ICS 菜单按钮图标?

jquery - 标签链接系统

android - 如何确定 intent 持有的 bundle 中 extra 的类型?

android - 如何在 Android 中获取 Facebook 个人资料图片

html - 我无法在我的 wordpress 网站中设计我的自定义菜单

java - 如何通过单击菜单项来更改布局?

android - 如何在 Android 中将自定义对象写入文件

android - Android Kotlin中的viewModel

android - 如何通过 kotlin 中的序数值获取枚举成员?