这个问题让我做噩梦:(
请考虑以下代码 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/