Android:如何在片段更改时重新创建操作栏

24

我有一个Activity,其中展示了几个Fragment。 Activity视图只包含使用自定义的FragmentPagerAdapter初始化的ViewPager。 此适配器提供了3个Fragment之间的导航。

除了操作栏以外,一切似乎都正常。

我在我的Fragment中覆盖了onCreateOptionsMenu()方法,以为每个Fragment创建单独的操作栏:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
    {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
//特定于Fragment的菜单创建 }

当我滑动时,新的Fragment出现,但是操作栏会保持几秒钟不变。可能几秒钟后会调用这个方法并更改操作栏。

当滑动完成后一段时间再更改操作栏时,看起来很糟糕。如何在滑动开始之前立即重新创建操作栏?

4个回答

26

你可以调用invalidateOptionsMenu();让Android在自动执行之前重新创建操作栏。

在更改片段的位置附近执行此操作,以尝试减少片段和操作栏变化之间的“滞后”。

编辑

完整的解决方案可能如下所示:

class activity extends Activity{

private void switchFragment(){

...do fragment changing stuff

activity.invalidateOptionsMenu();

}

}

class someFragment extends Fragment{

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();


    //fragment specific menu creation
}

}

在进行中的任何片段

activity.invalidateOptionsMenu();

然后将调用其

 onCreateOptionsMenu

你可以在那里创建特定于片段的菜单


问题是我找不到任何明显的方法来要求Android重新创建ActionBar。 - mc.dev
@Mik,我已经更新了我的答案来帮助你,但我并不完全理解你的意思... invalidateOptionsMenu() 应该“请求 Android 重新创建 ActionBar”。 - roarster
5
谢谢你的回答,但是:
  1. 当你调用.invalidateOptionsMenu();时,系统并不会真正重新创建操作栏(action bar)。它只会导致在你的片段中调用onCreateOptionsMenu(),让你可以更改菜单(它是操作栏的一部分)。如果你在片段中调用了setHasOptionsMenu(true),那么你甚至不需要调用invalidateOptionsMenu(),因为onCreateOptionsMenu()会自动被调用。
  2. 我找不到在滑动之前调用onCreateOptionsMenu()的方法。
- mc.dev

4

您可以通过实现onCreateOptionsMenu并在每个片段的onAttach回调中调用setHasOptionsMenu(true)来完成此操作,并相应更改操作。

如果要显示没有任何操作的片段,请在其中设置 setHasOptionsMenu(false)


感谢您提到 onAttachsetHasOptionsMenu - Steven

2

1

最终我找不到任何可行的方法来实现这一点。

最好的方法是将actionbar作为片段的一部分,而不是活动,但这是不可能的。

当滑动开始时(您可以在PageView中设置特殊侦听器),清除操作栏菜单和标题,并在滑动完成并显示新片段时再次设置菜单和标题。

它会产生一些时间延迟,而且在滑动过程中操作栏看起来空荡荡的,但这是你能做的最好的办法。
Android API是c...


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