Android - 将接口放入 Bundle

Posted

技术标签:

【中文标题】Android - 将接口放入 Bundle【英文标题】:Android - Put interface in Bundle 【发布时间】:2014-02-14 07:21:23 【问题描述】:

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

好的!这就是问题开始的地方。当我旋转屏幕时,我在actionBarMenu 上得到一个NullPointerException。 我知道...我没有在屏幕旋转之前保存它,所以通常我会去onSaveInstanceState并在那里保存我的菜单,除了actionBarMenu是一个界面...更具体地说,接口 com.actionbarsherlock.view.Menu 我无法修改它以使其实现 Parcelable 或 Serializable。

那么我怎样才能在包中保存一个界面呢?

【问题讨论】:

【参考方案1】:

您不应该在配置更改期间一直引用您的操作栏。屏幕旋转后,android 会重新创建你的 Activity,所有 UI 引用都应该被释放,否则你会引入引用泄漏。

在活动旋转后,为什么不在布尔 onCreateOptionsMenu 中再次获取 actionBarMenu 引用?

【讨论】:

【参考方案2】:

你不能。但是,您仍然可以通过将以下代码添加到您的活动中来在方向更改时保留您的成员变量

@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;
;

【讨论】:

这不是对上一个活动中的菜单的引用,而不是对重新创建的(当前)活动中的菜单的引用吗? 哦,是的。我没有完全阅读这个问题,并认为您正在尝试保留任何不依赖于您的Activity 的自定义类。我的错。 找不到任何名为onRetainCustomNonConfigurationInstance() 的方法,但我找到了onRetainNonConfigurationInstance(),它工作得很好。谢谢:) 哦,好吧,我只是说服自己它不起作用并改变了我的答案。但现在我会把它改回原来的;-)【参考方案3】:

你没有。你不保存界面。 您保存一些字符串、布尔值或整数,表示用户执行的操作。 然后检查该值并再次更改菜单。

【讨论】:

这就是问题所在,我必须保存整个菜单,因为我无法实例化它。【参考方案4】:

这在旋转之前有效吗?因为轮换只是重新创建了整个活动 - 即它再次经历了整个创建过程。所以,我不确定娱乐是你的问题,因为无论如何都应该再次调用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);

【讨论】:

以上是关于Android - 将接口放入 Bundle的主要内容,如果未能解决你的问题,请参考以下文章

android:将Serializable对象放入intent的问题

如何将listview和recyclerview放入linearlayout

Android PagerAdapter :: 将当前项目放入位图中

Android:如何将对话框放入循环中

清单中有啥权限可以将应用程序放入省电的android中

Android如何将listview放入查看寻呼机片段