java - 在自定义方法调用之前强制菜单膨胀

标签 java android

这个问题让我做噩梦:(
请考虑以下代码 fragment :

MainActivity.java

public class MainActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        mMenu = menu;
        return super.onPrepareOptionsMenu(menu);
    }

    protected void updateActionBar() {
        mMenu.findItem(R.id.action_some).setVisible(state); <---------------- mMenu is null
    }
}

BaseActivity.java

public abstract class BaseActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...

        updateActionBar(); <---------------- This causes crash

    }

    protected abstract void updateActionBar();
}

问题

调试后,我发现 updateActionBar() 的动态调度发生在调用 onPrepareOptionsMenu() 之前。因此,Menu 膨胀有点延迟,并且 mMenu 没有更新。

问题

如何确保在调用 updateActionBar() 之前填充 mMenu

注意:为了关注核心问题并提高可读性,我只粘贴了导致崩溃的部分代码。

最佳答案

How do I make sure that mMenu gets populated before call to updateActionBar()?

稍后调用 updateActionBar(),例如在 BaseActivity 中重写 onPrepareOptionsMenu()

updateActionBar() is being called inside a listener and moving the whole listener inside onresume doesn't make sense

听者在哪里并不重要。 您正在收听的事件很重要。显然,您正在使用监听器来监听 onPrepareOptionsMenu() 之前发生的某些事件。这是行不通的。要么:

  • 选择其他事件,或

  • 至少在调用 onPrepareOptionsMenu() 之前不要注册监听器,或者

  • 如果事件已触发,并且尚未调用 onPrepareOptionsMenu(),则无需实际执行工作,而是设置一个 boolean 值(例如 needToDoMenuStuff) 为 true,然后在 onPrepareOptionsMenu()

  • 中完成该工作

关于java - 在自定义方法调用之前强制菜单膨胀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33456034/

相关文章:

java - 从 Controller 下载安全页面,Spring security

java - 如何修复错误膨胀类 android.support.design.widget.NavigationView

java - 正则表达式拆分嵌套坐标字符串

java - WebDriverWait 在 Selenium 4 中已弃用

java - Flink 滑动窗口没有按预期工作

java - 带有 XML 数据库的 Android 歌曲歌词应用程序

android - 带有 JSON 数组的 ExpandableListView

android - 我可以通过在 shell 中发出命令来在手机本身上执行 logcat 吗?

java - Fragment中RecyclerView使用setAdapter时出错

Android DecimalFormat 不正确 rRoundUp