【问题标题】:Android: How to recreate Action bar when fragment changedAndroid:片段更改时如何重新创建操作栏
【发布时间】:2014-08-31 23:43:47
【问题描述】:

我有一个显示一些片段的活动。 Activity 视图仅包含使用自定义 FragmentPagerAdapter 初始化的 ViewPager。 此适配器提供 3 个片段之间的导航。

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

我在我的片段中覆盖 onCreateOptionsMenu() 方法来为任何片段创建单独的操作栏:

@覆盖 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.clear(); //fragment specific menu creation }

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

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

【问题讨论】:

    标签: android android-actionbar swipe


    【解决方案1】:

    你可以通过调用invalidateOptionsMenu();让android在它自动创建之前重新创建actionbar

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

    编辑

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

    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 重新创建操作栏。
    • @Mik 我已经更新了我的答案以提供帮助,但我并不完全理解你... invalidateOptionsMenu() 应该“要求 android 重新创建操作栏”
    • 谢谢你的回答,但是 1. 当你调用 .invalidateOptionsMenu();系统并没有真正重新创建操作栏。它只会导致在您的片段中调用 onCreateOptionsMenu() 允许您更改菜单(这是操作栏的一部分)。如果您在片段中调用了 setHasOptionsMenu(true),那么您甚至不必调用 invalidateOptionsMenu(),因为会自动调用 onCreateOptionsMenu()。 2. 在滑动之前我找不到调用 onCreateOptionsMenu() 的方法。
    【解决方案2】:

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

    显示没有任何动作的片段 setHasOptionsMenu(false)

    【讨论】:

    • 感谢您提及onAttach 和setHasOptionsMenu!
    【解决方案3】:

    如果您使用的是 ActionBar 选项卡,您希望看到这个答案:

    How can I change Action Bar actions dynamically?

    【讨论】:

      【解决方案4】:

      最后我找不到任何合理的方法来实现这一点。

      最好是让actionbar成为fragment的一部分,而不是activity,但这是不可能的。

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

      在滑动过程中会出现一些时间延迟,并且操作栏看起来很空,但您最好这样做。
      Android API 是 c...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多