我正在使用ActionBarSherlock,当用户执行某些操作时,我需要在操作栏上更改一些图标。为此,我必须保存操作栏以供日后使用:
private Menu actionBarMenu;
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.map_activity_menu, menu);
actionBarMenu = menu;
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
actionBarMenu.findItem(R.id.follow_my_position).setIcon(R.drawable.toolbar_myposition_active);
}
好的!这是问题开始的地方。当我旋转屏幕时,我会在NullPointerException
上获得actionBarMenu
我知道......我没有在屏幕旋转之前保存它,所以通常我会转到onSaveInstanceState
并将我的菜单保存在那里,除了 actionBarMenu
是一个接口...更具体地说,接口 com.actionbarsherlock.view.Menu ,我不能修改它,以便它实现Parcelable或Serializable。
那么如何在捆绑中保存接口呢?
答案 0 :(得分:1)
在配置更改期间,您不应该继续引用操作栏。屏幕旋转后,Android将重新创建您的活动,并且应该释放所有UI引用,否则您将引入参考泄漏。
为什么在活动旋转后,你没有在boolean onCreateOptionsMenu中再次获得actionBarMenu引用?
答案 1 :(得分:0)
你不是。您没有保存界面。 您可以保存一些String,或布尔值或整数,表示用户执行的操作。 然后检查此值并再次更改菜单。
答案 2 :(得分:0)
你做不到。但是,您仍可以通过将以下代码添加到活动
来保留成员变量的方向更改@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Object last = getLastNonConfigurationInstance();
if (last != null && last instanceof Menu) {
actionBarMenu = (Menu) last;
}
}
// for FragmentActivity it is onRetainCustomNonConfigurationInstance
public Object onRetainNonConfigurationInstance() {
return actionBarMenu;
};
答案 3 :(得分:0)
旋转之前是否有效?因为旋转只是重新创建整个活动 - 即它再次经历整个创建过程。所以,我不确定娱乐是你的问题,因为无论如何都应该再次调用onCreateOptionsMenu(Menu menu);
。
您确定actionBarMenu.findItem(R.id.follow_my_position)
正确返回吗?而不是处理它当前的状态 - 为什么不只是...不存储菜单并检查点击的菜单项呢?
例如:
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId()){
case R.id.follow_my_position:
item.setIcon(R.drawable.toolbar_myposition_active);
}
}
或者如果那不是您要找的,请检查您的findItem()调用是否找到该项:
MenuItem item = actionBarMenu.findItem(R.id.follow_my_position);
if(item != null){
item.setIcon(R.drawable.toolbar_myposition_active);
}