为ViewPager中的每个片段单独添加ActionItems

时间:2014-08-09 10:18:01

标签: android android-fragments android-actionbar android-viewpager

在我的MainActivity中,我正在实施导致2片段的ViewPager。问题是与ActionItems有点混淆。我想要的是每当我在片段之间滑动时,每个片段的ActionItems必须是不同的。任何人都可以指导我这件事。

目前,我没有在Activity上添加菜单项。但只有{{1>} 第二片段仅在两个片段上显示。 这是我的代码:

ActionItems

1stFragment

EDITED

2ndFragment

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

        inflater.inflate(R.menu.menu_one, menu);
        MenuItem searchItem = menu.findItem(R.id.searchWidgetOne);
        SearchView search = new SearchView(getActivity());
        search.setOnQueryTextListener(this);
        searchItem.setActionView(search);

        super.onCreateOptionsMenu(menu, inflater);
    }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            switch(item.getItemId())
            {
            case R.id.action_items_one:
                Intent addCrInent = new Intent(getActivity(), ActivityA.class);
                startActivity(addCrInent);

                return true;
            case  R.id.action_items_two:
                Intent addStIntent = new Intent(getActivity(), ActivityB.class);
                startActivity(addStIntent);

                return true;
            default:
                return false;
            }

    }

对于两个碎片,在MY onCreate中,我写了这一行:

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

        inflater.inflate(R.menu.menu_second, menu);
        MenuItem searchItem = menu.findItem(R.id.searchWidgetTwo);
        SearchView search = new SearchView(getActivity());
        search.setOnQueryTextListener(this);
        searchItem.setActionView(search);

        super.onCreateOptionsMenu(menu, inflater);
    }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            switch(item.getItemId())
            {
            case R.id.action_items_one_secondMenu:
                Intent addCrInent = new Intent(getActivity(), ActivityA.class);
                startActivity(addCrInent);

                return true;
            case  R.id.action_items_two_secondMenu:
                Intent addStIntent = new Intent(getActivity(), ActivityB.class);
                startActivity(addStIntent);

                return true;
            default:
                return false;
            }

    }

这是我的 setHasOptionsMenu(true);

menu_one.xml

这是我的<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/searchWidgetOne" android:actionViewClass="android.widget.SearchView" android:icon="@drawable/ic_action_search" android:orderInCategory="1" android:showAsAction="always|collapseActionView" android:title="@string/action_search"/> <item android:id="@+id/action_items_one" android:icon="@drawable/ic_action_new_event" android:orderInCategory="2" android:showAsAction="ifRoom" android:title="@string/add_course"/> <item android:id="@+id/action_items_two" android:icon="@drawable/ic_action_add_person" android:orderInCategory="3" android:showAsAction="ifRoom" android:title="@string/add_student"/>

menu_second.xml

我还在 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/searchWidgetTwo" android:actionViewClass="android.widget.SearchView" android:icon="@drawable/ic_action_search" android:orderInCategory="1" android:showAsAction="always|collapseActionView" android:title="@string/action_search"/> <item android:id="@+id/action_items_one_secondMenu" android:icon="@drawable/ic_action_new_event" android:orderInCategory="2" android:showAsAction="ifRoom" android:title="@string/add_course"/> <item android:id="@+id/action_items_two_secondMenu" android:icon="@drawable/ic_action_add_person" android:orderInCategory="3" android:showAsAction="ifRoom" android:title="@string/add_student"/> 中使用了 ivalidateOptionMenu() ,但徒劳无功。

2 个答案:

答案 0 :(得分:2)

我的一个应用程序遇到了类似的问题。 我找到的技巧(我说的诀窍)是,根据您的片段,隐藏未使用的项目并显示所需的项目。

在您管理片段的活动中,您也可以管理您的商品:

private Menu mMenu;

public void onCreateOptionsMenu(Menu menu,MenuInflater inflater)
{
    inflater.inflate(R.menu.note_menu, menu);
    mMenu = menu;
    ...
}

private void displayMenu1(boolean display)
{
    mMenu.findItem(<ID>).setVisible(display);
    mMenu.findItem(<ID2>).setVisible(display);
}

private void displayMenu2(boolean display)
{
    mMenu.findItem(<ID>).setVisible(display);
    mMenu.findItem(<ID2>).setVisible(display);
}

我确信这不是最佳解决方案,并且从那以后就没有想到更好的解决方案。

答案 1 :(得分:2)

您似乎在项目中做了一些不正确的事情。例如,您在menu_one.xmlmenu_second.xml中为菜单使用相同的drawable(图标)和字符串(title)。如果菜单应该执行不同的功能,请使用对图标和标题唯一的内容。

通过以下更改,Android开发者网站提供的EffectiveNavigation示例应用提供了预期的结果。

<强> MainActivity $ LaunchpadSectionFragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

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

<强> RES /菜单/ fragment_launchpad.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/searchWidgetOne"
        android:actionViewClass="android.widget.SearchView"
        android:icon="@android:drawable/ic_menu_search"
        android:orderInCategory="1"
        android:showAsAction="always|collapseActionView"
        android:title="@android:string/search_go"/>
    <item
        android:id="@+id/action_items_one"
        android:icon="@android:drawable/btn_plus"
        android:orderInCategory="2"
        android:showAsAction="ifRoom"
        android:title="@android:string/ok"/>

</menu>

<强> MainActivity $ DummySectionFragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

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

<强> RES /菜单/ fragment_dummy_section.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/searchWidgetTwo"
        android:actionViewClass="android.widget.SearchView"
        android:icon="@android:drawable/ic_btn_speak_now"
        android:orderInCategory="1"
        android:showAsAction="always|collapseActionView"
        android:title="@android:string/search_go"/>
    <item
        android:id="@+id/action_items_two"
        android:icon="@android:drawable/btn_minus"
        android:orderInCategory="2"
        android:showAsAction="ifRoom"
        android:title="@android:string/ok"/>

</menu>

结果

animated screenshot