将操作按钮添加到一个片段的操作栏

时间:2015-12-15 16:41:29

标签: android android-fragments

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

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

            }
        });

我自己没试过这个。

答案 1 :(得分:0)

在标签页适配器中创建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;
}

然后在片段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

中夸大Fragemnt菜单
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflator) {
    inflator.inflate(R.menu.first_tab_menu, menu);
    super.onCreateOptionsMenu(menu, inflator);
}
相关问题