这个问题让我做恶梦:(
请考虑以下代码段:
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()
?
注意:为了专注于核心问题并提高可读性,我只粘贴了导致崩溃的部分代码。
答案 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)
}
});