【问题标题】:Android - Put interface in BundleAndroid - 将接口放入 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。

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

【问题讨论】:

    标签: android actionbarsherlock 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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 2012-11-07
        • 1970-01-01
        相关资源
        最近更新 更多