【问题标题】:Add Action Button to Action Bar For One Fragment为一个片段的操作栏添加操作按钮
【发布时间】:2015-12-15 16:41:29
【问题描述】:

我的应用程序有三个标签,我正在使用寻呼机在标签之间切换。每个选项卡都有自己的片段。我使用 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);
}

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

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

谢谢!

【问题讨论】:

  • 所有标签片段都相似吗?

标签: android android-fragments


【解决方案1】:

一种更简单的方法是将菜单项包含在您的活动菜单项中,并根据选项卡选择以编程方式显示和隐藏它。 在 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) {

            }
        });

我自己没有尝试过。

【讨论】:

  • 这对我有用。在您的示例中,在第 0 页的片段中添加的一项是在片段的 onCreate 中 setHasOptionsMenu(true),然后在片段中添加 onOptionsItemSelected(MenuItem item) 而不是主要活动。只需将代码保存在所有正确的位置即可。
  • 不幸的是,此方法不适用于屏幕旋转。当屏幕旋转时,会调用onCreateOptionsMenu,但不会调用onPageChangeListener。因此,如果显示第三页,则屏幕旋转时会显示 clear_form 的图标。必须为onPageChangeListener 选择另一页才能赶上。
【解决方案2】:

这就是我解决视图分页器中只有一个页面的操作栏中有一个图标的问题的方法。

  1. 以通常的方式在主活动中创建完整菜单,包括仅应为特定页面显示的项目。保存对在 Application 对象中为每个页面更改的 menuItem 的引用。

  2. 如上实现onPageChangelistener,并根据需要为每个页面设置menuItem的可见性。您可以从 Application 对象访问 menuItem。这会使菜单项保持在特定的手机方向,但在手机方向改变时会失败。将当前页面位置保存在 Application 对象中。请务必将Application对象中的页面位置初始化为第一页(即0)。

  3. 在主活动的 onCreateOptionsMenu 中,使用当前页面位置(在 Application 对象中找到)来确定 menuItem 是否应该可见。这将负责屏幕旋转。

【讨论】:

    【解决方案3】:

    当您在标签页适配器中创建 newInstance 中的 TabFragement 时,请在片段参数中包含标签部分编号。

    /**
     * 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;
    }
    

    然后在 Fragment OnCreate 检查选项卡部分编号以设置 Fragment 是否应具有选项菜单

    只有第 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 中扩充Fragemnt 菜单

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflator) {
        inflator.inflate(R.menu.first_tab_menu, menu);
        super.onCreateOptionsMenu(menu, inflator);
    }
    

    【讨论】:

    • 我没有尝试这种方法,因为下面的方法似乎是正确的解决方案。我尝试了很多在片段中启用/禁用 menuItem 的方法,但它们都不起作用。清除按钮对所有片段都可见,或者对任何片段都不可见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多