ViewPager 中嵌套片段的 OptionsMenu

Posted

技术标签:

【中文标题】ViewPager 中嵌套片段的 OptionsMenu【英文标题】:OptionsMenu of Nested Fragments within ViewPager 【发布时间】:2013-11-17 13:26:10 【问题描述】:

我正在使用 ActionBarSherlock,我正在尝试使用 viewpager 实现嵌套片段结构。

我有一个包含一些视图和包装片段 (FragmentA) 的活动

此 FragmentA 包含一个显示 FragmentA.1、FragmentA.2、FragmentA.3 的视图分页器。

默认情况下,onCreateOptionsMenu 事件不会按原样分派给子片段 讨论了here。所以我正在使用this 解决方案来解决这个问题。

它在 API 级别 17 上运行良好,但在下面它不显示第一个片段的选项菜单,但是当我滚动到其他片段时,一切都开始正常工作。我尝试从父片段调用 onCreateOptionsMenu 但没有结果。当我滚动回第一个片段时它也可以工作。

有什么建议吗?

更新:

更清晰的结构表达方式:

通过包装片段,我的意思是保存 viewpager 的片段。所以结构是

ACTIVITY 
        -> WRAPPER FRAGMENT (holds viewpager and passes childfragmentmanager to adapter(FragmentPagerAdapter) as fragmentmanager) (parent is activity)
             -> CHILDFRAGMENTS(items of viewpager) (parent is wrapper fragment but viewpager manages its framelayout)

我还找到了一个不太好的临时解决方案:

if(Build.VERSION.SDK_INT > 17)

            pager.setCurrentItem(1,false);

         else 

            new android.os.Handler().postDelayed(new Runnable() 
                @Override
                public void run() 
                    pager.setCurrentItem(1, true);
                
            , 300);


        

【问题讨论】:

【参考方案1】:

您可能会在活动创建结束之前初始化视图寻呼机。 这是问题所在,因为子片段创建了他们的选项菜单,但随后,活动使所有选项菜单无效。 您必须在包装片段的 onActivityCreated 方法中初始化寻呼机。

【讨论】:

【参考方案2】:

编辑

if(viewPagerAdapter.getItem(view_pager.getCurrentItem()) instanceof FragmentToFind)

    FragmentToFind fragment = (FragmentToFind) viewPagerAdapter.getItem(view_pager.getCurrentItem());

    fragment.onCreateOptionsMenu(menu, inflater);

【讨论】:

感谢您的努力,但 getChildFragmentManager() 在 onCreateOptionsMenu 中调用时返回 null。另外如何在 viewpager 中获取当前片段的 id? 我更改了代码,因为我认为您的问题与片段导航有关。希望对您有所帮助。 您在 viewpager 项目中添加了一个片段(一个片段)。这又增加了一个不必要的片段级别。我已经更新了问题,可能是我解释的不够清楚。 我不知道这是否重要,但是您保存视图寻呼机的包装片段应该是SherlockFragmentActivity 来托管视图寻呼机和片段。我第一次尝试对视图寻呼机中的项目使用 onCreateOptionsMenu 时,它的工作原理如下:将setHasOptionsMenu(true); 放入 onCreate()。然后片段将调用 onCreateOptionsMenu() 在片段中将是这样的:@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 然后,如果您的菜单 xml 中有对象,则使用充气器;如果您想以编程方式添加它们,则使用 super.onCreateOptionsMenu(menu, inflater);

以上是关于ViewPager 中嵌套片段的 OptionsMenu的主要内容,如果未能解决你的问题,请参考以下文章

FragmentStatePagerAdapter 内存泄漏(带有 viewpager 的嵌套片段)

带有嵌套片段的导航抽屉 (ViewPager)

在渲染之前触发ViewPager片段内嵌套片段的动画

带有 Viewpager2 的关键 FragmentStateAdapter 的片段不再存在

Viewpager 不清除片段

onActivityResult 从未在我的嵌套片段中调用