在切换 Fragment 时,操作栏按钮消失问题

9
我有一个带有多个选项卡的应用程序,每个选项卡在操作栏中都有不同的选项菜单图标。一些选项卡有两个图标,而另一些则没有。
问题是当我在屏幕之间滑动时,各个屏幕的按钮可能会显示或不显示。例如,在应该有两个图标的屏幕上,操作栏中将没有任何图标!
然而,当我点击选项卡时,屏幕总是正确地显示相应的图标。
我已经尝试在调试器中分析问题。我确信FragmentPagerAdapter为新选择的Fragment正确地调用了setMenuVisibility(true),并且其他Fragment则被调用了setMenuVisibility(false)。
我找不到关于按钮出现/消失的确切模式。我可以在两个具有不同按钮的屏幕之间向左/向右滑动。问题会在1到20次滑动后的任何地方发生。
消失似乎会因为向一个只有一个图标的屏幕滑动,然后返回到一个有两个图标的屏幕。
我已经尝试添加Activity.invalidateOptionsMenu()的调用,但似乎没有影响。例如,我将此调用添加到我的TabAdapter的onPageScrollStateChanged()中,该方法在滑动动画完成后调用。我还尝试将其添加到Fragments的onResume()或TabAdapter.onTabSelected()完成之后,但都没有效果。
我正在使用ActionBarSherlock 4.1.0(由于其他问题,我已经替换了最新的android-support-v4.jar)。我的Activity扩展了SherlockFragmentActivity并简单地实例化了一个ViewPager。我已经重写了ViewPager的适配器的FragmentPagerAdapter(遵循ViewPager Android文档上的标准示例)。
我的手机运行Android 2.3.5。

FYI,升级到ABS 4.2.0并没有解决问题。进一步描述问题,ViewPager中的每个片段都有一个不同的选项菜单XML文件,在onCreateOptionsMenu()中膨胀。包含SherlockFragmentActivity的也有一个菜单,在onCreateOptionsMenu()中膨胀。我尝试注释掉该Activity的菜单膨胀,看看是否会干扰,但它并没有。与问题报告中报告的相同行为。我打算制作一个示例项目来展示这个错误。 - jfritz42
另一个数据点:如果我从TabsAdapter的onPageScrollStateChanged()中调用viewPager.postInvalidate(),它会导致问题出现的时间更长。也就是说,在ActionBar冻结且按钮丢失之前,您可以在选项卡之间进行多次滑动。 - jfritz42
@CommonsWare 谢谢建议。由于应用程序的复杂性,我很害怕采取那种方法,但我可能不得不这样做。 - jfritz42
我发现,如果主 Activity 没有菜单,只有片段有菜单,问题并没有消失,但至少它不会陷入“丢失按钮,ActionBar 冻结”的问题中。你可以点击另一个选项卡然后返回,按钮就会出现。对我来说,这已经足够好了。 - jfritz42
我知道这是一个老问题,但我想分享我的经验。我遇到了同样的问题,其中一些选项卡没有使用搜索图标。我不是为每个选项卡填充菜单,而是简单地关闭我不需要的图标的可见性,并打开我需要的图标的可见性。然而,事实证明,当关闭搜索图标的可见性时,有时会导致其他图标消失,我通过重新排列栏中图标的顺序来解决这个问题;以便搜索图标是最右边的 - 具有最高的 android:orderInCategory 数字。 - Zvi
显示剩余12条评论
2个回答

6

1

只需跟随此链接

if (viewPager.getCurrentItem() != position)
  viewPager.setCurrentItem(position);

在onCreate中推迟调用viewPager.setCurrentItem。
public void onCreate(...) {
    ...
    view.post(new Runnable() {
        public void run() {
            // guarded viewPager.setCurrentItem
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接