android - 将操作按钮添加到一个 fragment 的操作栏

标签 android android-fragments

我的应用程序有三个选项卡,我使用寻呼机在选项卡之间切换。每个选项卡都有自己的 fragment 。我使用 OptionsMenu 方法将设置和帮助操作按钮添加到主 Activity 的操作栏中。我现在想向操作栏添加一个新的操作按钮,但只是针对第一个选项卡和第一个 fragment ,我不希望它出现在其他 fragment 上,当它们显示在它们的选项卡中时。

我在主 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>

此菜单正确显示并按预期工作。

我有另一个菜单,第一个 fragment 的 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>

然后我在第一个 fragment 中使用以下代码将其添加到操作栏 -

@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);
}

问题是当我转到其他页面/选项卡上的其他 fragment 时,这个添加的按钮不会消失。其他 fragment 中没有任何选项菜单代码。

然后我将此代码添加到其他 fragment 以删除一个按钮。

@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);
}

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

如何在我的三选项卡(即三个 fragment )应用程序中为一个选项卡(即 fragment )添加一个 Action 按钮到操作栏?它应该仅在选择(显示)该选项卡( fragment )时出现。

谢谢!

最佳答案

一种更简单的方法是将菜单项包含在您的 Activity 菜单项中,并根据选项卡选择以编程方式显示和隐藏它。 在 onCreateOptionsMenu 方法中获取对菜单项的引用,并使其在外部可用。

@Override
    public boolean onCreateOptionsMenu(Menu menu) {

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

在 viewpager 上使用 addOnPageChangeListener 来更改菜单项的可见性。

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) {

            }
        });

我自己还没有尝试过。

关于android - 将操作按钮添加到一个 fragment 的操作栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34294715/

相关文章:

java - Android Handler 定义语法

android - 带有 ActionBar 的 NoSuchMethodError 异常

android - 是否可以通过在 XML 中定义它的状态来启动隐藏的 fragment ?

java - 当应用程序在 Android 中启动时从服务器更新 fragment

android - 与ConstraintLayout中的 fragment 一起使用时,Textview不可见

android - HttpLoggingInterceptor (OkHttp3) 为每个请求记录很多次

java - android.os.ServiceManager 无法解析

android - 在 onCreateView 之外使用 android Inflate

Android:一个 ViewModel 可以用于多个 Fragment 吗?

android - 我的应用应该在多大程度上使用 fragment ?