android - 损坏的 ActionBar 外观

标签 android android-actionbar actionbarsherlock

我很久以前就注意到了这个问题,但直到现在我才能够准备清楚地重现它的演示。该问题存在于 2.1 模拟器和我的 ICS 4.0.3 设备上。

在应用程序中,我有 AsyncTask,它可以通过调用 invalidateOptionsMenu 调整操作栏不确定进度和重新初始化菜单的可见性。这应该隐藏刷新图标。在我修改 listView 数据模型并在适配器上调用 notifyDataSetChanged 之前,这一切正常。在这样的操作之后,Actionbar 可能会破坏 View 。

预期 View : image

损坏的 View (最后一项永远消失或在某些情况下添加空白代替): image image

引起代码在onPostExecute

    @Override
        protected void onPostExecute(Void result)
        {
            super.onPostExecute(result);
            for (int i = 0; i < 10; i++)
            {
                adapter.items.add(i);
            }
            adapter.notifyDataSetChanged();
            activity.stopLoading();
        }
...
    void stopLoading()
    {
        if (loaders.decrementAndGet() == 0)
        {
            setSupportProgressBarIndeterminateVisibility(false);
            invalidateOptionsMenu();
        }
    }

知道为什么会发生这种情况,并且在大多数情况下是因为更新 ListView 适配器(或者可能是一些过度 View 更新)?如果我删除行 adapter.notifyDataSetChanged();操作栏不会在演示中被破坏。但在实际应用中,它也可能由于其他原因而被破坏(无法确定所有问题的确切原因)

演示问题的项目:http://goo.gl/ZbMTU

打开ActionBarSherlock问题:https://github.com/JakeWharton/ActionBarSherlock/issues/887

更新: 继续挖掘这个问题。似乎不完全是 adapter.notifyDataSetChanged() 导致无效外观,而是 AdapterView.AdapterDataSetObserver 调用的 requestLayout 正在监听 ListView 中的数据集更改事件

存在解决方法,我可以在 handler.post 中调用 invalidateOptionsMenu 和 setSupportProgressBarIndeterminateVisibility。但它甚至强制使用 FragmentPagerAdapter 的自定义实现,它在延迟的 handler.post 中调用 fragment.setHasOptionsMenu

我想要的是找到最有效的方法来使 View 和操作栏无效而不破坏它。

最佳答案

我不明白你为什么在 doInBackground 中这样做:

Thread.sleep(randomSleep);

但是,在“LoadingTask”类中,注释“doInBackground”中的行,问题将得到解决。

见:

        @Override
        protected Void doInBackground(Void... params)
        {
//          int randomSleep = (int) (Math.random() * 1000);
//          try
//          {
//              Thread.sleep(randomSleep);
//          } catch (InterruptedException e)
//          {
//              // TODO Auto-generated catch block
//              e.printStackTrace();
//          }
            return null;
        }

关于android - 损坏的 ActionBar 外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15918330/

相关文章:

android - AsyncTask 和 fragment 异常 android.view.WindowManager$BadTokenException

android - 继承ActionBarSherlock和Android YouTubePlayer

java - RuntimeException : view tag isn't correct on view:null on ViewAgendaItemBinding. 绑定(bind)()方法

android - 有没有办法专门为堆叠操作栏设置 actionBarTabTextStyle?

java - 后台 Android Activity - 记录 GPS

android actionbar 在超大屏幕的标签下方

android - 在溢出按钮上锚定弹出菜单

android - commonsware 书中的 ActionBarsherlock 问题

android - 从 Android 股票浏览器中的网页打开 PDF

android - binding.root 表示什么?