为一个Fragment在Action Bar中添加操作按钮

3
我的应用程序包含三个选项卡,并使用分页器在它们之间进行切换。每个选项卡都有自己的片段。我使用OptionsMenu方法在主Activity中的操作栏中添加了设置和帮助操作按钮。现在,我想为第一个选项卡和第一个片段添加一个新的操作按钮,但是我不希望它出现在其他选项卡中显示它们的片段中。
我已经为主菜单创建了这个布局,它是在主活动中创建的。
    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100" app:showAsAction="never" />

    <item android:id="@+id/help"
        android:title="@string/help"
        android:orderInCategory="100" app:showAsAction="never" />
</menu>

这个菜单显示正常,功能也和预期一样。
我还有另一个菜单,名为menu_prelaunch_fragment,是用于第一个碎片的。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/clear_form"
        android:title="Clear"
        android:icon="@drawable/ic_action_action_delete"
        app:showAsAction="always" />
</menu>

我将使用以下代码在第一个片段中将其添加到操作栏中:

我使用以下代码将其添加到操作栏中 -

@Override
public void onCreate(Bundle savedInstance) {
    Log.d(TAG, "onCreate");
    super.onCreate(savedInstance);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflator) {
    Log.d(TAG, "onCreateOptionsMenu");
    inflator.inflate(R.menu.menu_prelaunch_fragment, menu);
    super.onCreateOptionsMenu(menu, inflator);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Log.d(TAG, "onOptionsItemSelected");
    if (item.getItemId() == R.id.clear_form)
        clearFragmentData();
    return super.onOptionsItemSelected(item);
}

问题在于,当我切换到其他页面/选项卡的其他片段时,这个添加的按钮并不会消失。其他片段中没有任何选项菜单代码。
然后,我向其他片段添加了以下代码以删除一个按钮。
@Override
public void onCreate(Bundle savedInstanceState) {
    Log.d(TAG, "onCreate");
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onPrepareOptionsMenu (Menu menu) {
    menu.findItem(R.id.clear_form).setVisible(false);
    super.onPrepareOptionsMenu(menu);
}

但是现在,无论选择哪个选项卡,清除按钮都不会出现在操作栏中。

如何为我的三选项卡应用程序中的一个选项卡(即片段)添加操作按钮到操作栏?只有当选择(显示)该选项卡(片段)时才应该出现。

谢谢!


所有的选项卡碎片都相似吗? - TouchBoarder
3个回答

3
一种更简单的方法是将菜单项包含在您的活动菜单项中,并根据选项卡选择编程性地显示和隐藏它。 在onCreateOptionsMenu方法中获取菜单项的引用,并使其在外部可用。
@Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu, menu);
          checkOut = (MenuItem) menu.findItem(R.id.action_abc);  
        return true;
    }

使用addOnPageChangeListener来监听viewpager,以改变菜单项的可见性。
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if (position == 0) {               
                    menuItem.setVisible(true);
                } else {
                    menuItem.setVisible(false);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

我个人没有尝试过这个。


这对我有用。一个额外的建议是在你的示例中页面0的片段中,在片段的onCreate中设置setHasOptionsMenu(true),然后在片段中添加onOptionsItemSelected(MenuItem item)而不是在主活动中添加。这样可以保持代码放置的正确性。 - user1045680
不幸的是,该方法不适用于屏幕旋转。当屏幕旋转时,会调用onCreateOptionsMenu,但不会调用onPageChangeListener。因此,如果显示第三页,则在屏幕旋转时将显示clear_form的图标。必须选择另一页以使onPageChangeListener跟上。 - user1045680

1
这是我解决在视图分页器中仅为一个页面添加操作栏图标的问题的方法。
1. 创建完整菜单,包括仅应在特定页面显示的项,在主活动中按通常方式。在应用程序对象中保存每个页面更改的menuItem的引用。
2. 实现如上所述的onPageChangeListener,并根据需要设置每个页面的menuItem的可见性。您可以从应用程序对象访问menuItem。这将保持特定手机方向下您想要的菜单项,但在手机方向更改时会失败。在应用程序对象中保存当前页面位置。请确保将应用程序对象中的页面位置初始化为第一页(即0)。
3. 在主活动的onCreateOptionsMenu中,使用当前页面位置(在应用程序对象中找到)来确定是否应显示menuItem。这将处理屏幕旋转的情况。

0

当您在选项卡页面适配器中创建TabFragementnewInstance时,请在Fragment参数中包含选项卡部分编号。

/**
 * Returns a new instance of this fragment for the given tab section
 * number.
 */
public static TabFragment newInstance(int sectionNumber) {
    TabFragment fragment = new TabFragment ();
    Bundle args = new Bundle();
    args.putInt(ARG_SECTION_NUMBER, sectionNumber);
    fragment.setArguments(args);
    return fragment;
}

然后在片段的 OnCreate 中检查选项卡部分的编号,以设置片段是否应具有选项菜单

只有第0部分编号充气菜单:setHasOptionsMenu(sectionNumber==0 ? true:false);

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sectionNumber=getArguments().getInt(ARG_SECTION_NUMBER);

    setHasOptionsMenu(sectionNumber==0?true:false);
}

void onCreateOptionsMenu中展开片段菜单。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflator) {
    inflator.inflate(R.menu.first_tab_menu, menu);
    super.onCreateOptionsMenu(menu, inflator);
}

我没有尝试这种方法,因为下面的方法似乎是正确的解决方案。我尝试了很多启用/禁用片段中menuItem的方法,但它们都不起作用。要么清除按钮对所有片段可见,要么对所有片段都不可见。 - user1045680

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