java - 当应用程序来自后台时更改菜单图标(在 onResume() 方法中)

标签 java android xml android-menu

我尝试了 onCreateOptionsMenu(Menu menu)onPrepareOptionsMenu(Menu menu) 方法,但是当应用程序在后台打开时,我无法更改图标可见性。因为我认为我需要在 onResume()

中调用这些方法

当应用程序第一次启动时它按预期工作。

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it present.
        getMenuInflater().inflate(R.menu.example_menu, menu);

        // show manu items if not ofline mode
        if (Utils.checkNetworkStatus(ExampleActivity.this)) {
            menu.findItem(R.id.edit).setVisible(true);
            menu.findItem(R.id.delete).setVisible(true);
        }else {
            menu.findItem(R.id.edit).setVisible(false);
            menu.findItem(R.id.delete).setVisible(false);
        }
        return true;
    }



@Override
public boolean onPrepareOptionsMenu(Menu menu){

    if (Utils.checkNetworkStatus(ExampleActivity.this)) {
        menu.findItem(R.id.edit).setVisible(true);
        menu.findItem(R.id.delete).setVisible(true);
    }else {
        menu.findItem(R.id.edit).setVisible(false);
        menu.findItem(R.id.delete).setVisible(false);
    }
    return true;
} 

最佳答案

感谢@jon 和@Oliver Adam 的回答。

它指引我找到最终的解决方案。这就是我以 100% 准确度解决问题的方法。

根据文档,如果我们需要在运行时更改菜单项,建议使用onPrepareOptionsMenu(Menu menu)方法,而不是使用onCreateOptionsMenu(Menu menu)

After the system calls onCreateOptionsMenu(), it retains an instance of the Menu you populate and will not call onCreateOptionsMenu() again unless the menu is invalidated for some reason. However, you should use onCreateOptionsMenu() only to create the initial menu state and not to make changes during the activity lifecycle.

If you want to modify the options menu based on events that occur during the activity lifecycle, you can do so in the onPrepareOptionsMenu() method. This method passes you the Menu object as it currently exists so you can modify it, such as add, remove, or disable items. (Fragments also provide an onPrepareOptionsMenu() callback.)--Official Android Documentation--

我们需要在 onResume() 方法中调用 invalidateOptionsMenu() 以在应用程序从后台返回时刷新 View 。

 @Override
 protected void onResume() {
   super.onResume();

   invalidateOptionsMenu();
 }


@Override
  public boolean onPrepareOptionsMenu(Menu menu){
    if (Utils.checkNetworkStatus(ExampleActivity.this)) {
        menu.findItem(R.id.edit).setVisible(true);
        menu.findItem(R.id.delete).setVisible(true);
    }else {
        menu.findItem(R.id.edit).setVisible(false);
        menu.findItem(R.id.delete).setVisible(false)
    }
    return true;
  }

关于java - 当应用程序来自后台时更改菜单图标(在 onResume() 方法中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46504978/

相关文章:

c# - 将 Web 服务中的数据表写入 XML 的最佳方式?

php - 将 XML SOAP 响应转换为 CSV

javascript - 在 IIS 上显示来自 javascript 文件(SOAP 请求)的 XML 响应

Java:有没有更有效的方法来做到这一点?检查素数

java - 奇怪的乐观锁异常

Android如何在gridview布局中查找相邻项目

android - 有什么方法可以访问 Android 的 WebView 中的 DOM 结构?

java - jnlp 突然与 java web start 一起损坏

java - libGDX 动画打开和关闭

android - 如何在 Android Manifest 中排除所有 GPU 低的设备?