【问题标题】:OptionsMenu of Fragments in Viewpager showing each other's ButtonsViewpager 中 Fragments 的 OptionsMenu 显示彼此的按钮
【发布时间】:2014-11-15 22:15:33
【问题描述】:

我在 viewpager 中有三个片段。

其中两个片段有自己的 onCreateOptionsMenu 方法版本:

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

    // Set up 1 action button
    inflater.inflate(R.menu.home_snapshot_add, menu);
}

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

    // Set up 2 action buttons
    inflater.inflate(R.menu.home_snapshot_send, menu);
}

home Activity 有一个基本的 onCreateOptionsMenu 方法:

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    return false;
}

在onCreate方法中,每个片段都会调用该方法:

setHasOptionsMenu(true);

每个菜单项都有标签:

android:showAsAction="always"

似乎当我打开 Activity 时,所有三个按钮都出现了。 但是,当我滚动浏览它们时,错误的会神奇地消失。 感觉就像活动在创建活动时调用每个片段的选项菜单,然后在我左右滑动时适当地更改菜单。 我检查了菜单,但不确定出了什么问题。 你认为我需要检查什么吗?我有点想不通。

谢谢!

【问题讨论】:

    标签: android android-fragments android-actionbar android-optionsmenu


    【解决方案1】:

    在您的ViewPagerOnPageChangeListener 中并在将适配器设置为ViewPager 后,有这个:

    @Override
    public void onPageSelected(int position){
       invalidateFragmentMenus(position);
    }
    
    
    private void invalidateFragmentMenus(int position){
       for(int i = 0; i < mViewPagerFragentAdapter.getCount(); i++){
          mViewPagerAdapter.getItem(i).setHasOptionsMenu(i == position);
       }
       invalidateOptionsMenu(); //or respectively its support method.
    }
    

    设置片段适配器后,使用以下参数调用相同的方法:

    invalidateFragmentMenus(mViewPager.getCurrentItem());
    

    上述语句将阻止所有其他片段在调用invalidateOptionsMenu() 时不接收onCreateOptionsMenu() 方法的调用,只有当前可见的片段将接收并能够填充选项菜单。

    【讨论】:

    • 感谢您的超快速响应!我的代码有很多问题。 1. 我将所有片段的 setHasOptionsMenu 设置为 true。 (您的代码解决了这个问题) 2. 我有一个嵌套片段,它没有被您的代码捕获 3. 活动自己的 OptionsMenu 正在膨胀自己的菜单,以尝试初始化菜单。 (已删除)再次感谢!
    • 您可以使用getChildFragmentManager() 遍历子片段并应用相同的逻辑,然后调用invalidateOptionsMenu()
    • 只有在您的寻呼机适配器中保留一个片段引用列表时才有效。这是我个人不喜欢的模式,因为 android 必须为我做这件事,而寻呼机的全部目的是在我们滑动页面时释放内存......所以我的 adapter.getItem 函数只返回新片段。
    • 我在片段的 onCreate 中通过 setHasOptionMenu(true) 解决了同样的问题,并将其作为 onCreateOptionMenu 。 stackoverflow.com/a/43730933/3496570
    【解决方案2】:

    我用过这个,它对我有用:

    //In your Fragment
    @Override
    public void onResume() {
        super.onResume();
        setHasOptionsMenu(isVisible());
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      相关资源
      最近更新 更多