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

时间:2015-10-31 20:05:47

标签: java android

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

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没有更新。

问题

在致电mMenu之前,如何确保填充updateActionBar()

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

2 个答案:

答案 0 :(得分:1)

  

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

稍后调用updateActionBar(),例如在onPrepareOptionsMenu()中覆盖BaseActivity

  

updateActionBar()是在一个监听器内调用的,并且将整个监听器移到onresume内是没有意义的

哪里监听器无关紧要。 你正在听什么事很重要。显然,您正在使用侦听器来处理onPrepareOptionsMenu()之前可能发生的事件。那样不行。之一:

  • 选择其他活动,或

  • 在调用至少onPrepareOptionsMenu()

  • 之前,不要注册听众
  • 如果事件被触发,并且未调用onPrepareOptionsMenu(),而不是实际执行您的工作,请将boolean值(例如needToDoMenuStuff)设置为{{ 1}},然后在true

  • 中完成这项工作

答案 1 :(得分:0)

这样的事可能对你有用:

final LinearLayout layout = (LinearLayout) findViewById(R.id.yourLayout); // might not be linearLayout
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // Code to be executed after layout complete. (updateActionBar)
    }
});