Android - 将接口放入Bundle

时间:2014-01-23 16:03:25

标签: android actionbarsherlock parcelable serializable

我正在使用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。

那么如何在捆绑中保存接口呢?

4 个答案:

答案 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);
}