Android 为ViewPager中的每个片段分别添加ActionItems

Android 为ViewPager中的每个片段分别添加ActionItems,android,android-fragments,android-actionbar,android-viewpager,Android,Android Fragments,Android Actionbar,Android Viewpager,在我的main活动中,我正在实现ViewPager,它将导致2个片段。问题是我对ActionItems的放置位置有点困惑。我想要的是,每当我在片段之间滑动时,每个片段的ActionItems必须不同。有人能给我指点一下吗 目前,我没有在活动中添加菜单项。但是只有第二个片段的ActionItems仅显示在两个片段上。 这是我的密码: 编辑 对于1stFragment: @Override public void onCreateOptionsMenu(Menu menu, MenuInfl

在我的
main活动中
,我正在实现
ViewPager
,它将导致2个片段。问题是我对ActionItems的放置位置有点困惑。我想要的是,每当我在片段之间滑动时,每个片段的
ActionItems
必须不同。有人能给我指点一下吗

目前,我没有在活动中添加菜单项。但是只有第二个片段的
ActionItems
仅显示在两个片段上。 这是我的密码:

编辑

对于1stFragment

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

    }
对于2ndFragment

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

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

        setHasOptionsMenu(true);
这是我的
菜单\u 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"/>


我在
onPageSelected()
中也使用了
ivalidateOptionMenu()
,但没有用

我的一个应用程序也有类似的问题。 我发现的诀窍(我说的诀窍)是,根据您的片段,隐藏未使用的项目并显示所需的项目

在管理片段的活动中,只需管理项目即可:

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);
}
私有菜单mMenu;
创建选项菜单(菜单菜单,菜单充气机)
{
充气机。充气(右菜单。注意菜单,菜单);
mMenu=菜单;
...
}
专用void displayMenu1(布尔显示)
{
mMenu.findItem().setVisible(显示);
mMenu.findItem().setVisible(显示);
}
专用void displayMenu2(布尔显示)
{
mMenu.findItem().setVisible(显示);
mMenu.findItem().setVisible(显示);
}

我确信这不是最好的解决方案,而且从那以后也没有想到任何更好的解决方案。

我的一个应用程序也有类似的问题。 我发现的诀窍(我说的诀窍)是,根据您的片段,隐藏未使用的项目并显示所需的项目

在管理片段的活动中,只需管理项目即可:

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);
}
私有菜单mMenu;
创建选项菜单(菜单菜单,菜单充气机)
{
充气机。充气(右菜单。注意菜单,菜单);
mMenu=菜单;
...
}
专用void displayMenu1(布尔显示)
{
mMenu.findItem().setVisible(显示);
mMenu.findItem().setVisible(显示);
}
专用void displayMenu2(布尔显示)
{
mMenu.findItem().setVisible(显示);
mMenu.findItem().setVisible(显示);
}

我确信这不是最好的解决方案,而且从那以后也没有想到任何更好的解决方案。

您似乎在项目中做了一些不正确的事情。例如,您在
menu\u one.xml
menu\u second.xml
中对菜单使用相同的可绘制(图标)和字符串(标题)。如果菜单应该具有不同的功能,则应为图标和标题使用独特的内容

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

main活动$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);
}
<?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>
@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);
}
<?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>
res/menu/fragment\u launchpad.xml

@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);
}
<?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>
@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);
}
<?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>
res/menu/fragment\u dummy\u section.xml

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

和结果

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

您似乎在项目中做了一些不正确的事情。例如,您在
menu\u one.xml
menu\u second.xml
中对菜单使用相同的可绘制(图标)和字符串(标题)。如果菜单应该具有不同的功能,则应为图标和标题使用独特的内容

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

main活动$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);
}
<?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>
@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);
}
<?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>
res/menu/fragment\u launchpad.xml

@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);
}
<?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>
@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);
}
<?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>
res/menu/fragment\u dummy\u section.xml

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

和结果

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

Thnx对于您的答案,让我来实施它。我需要在哪里实施它。因为如果我在我的活动中实现它,它会为菜单项提供NullPointerException。Thnx对于你的答案,让我实现它。我需要在哪里实现它。因为如果我在我的活动中实现它,它会为菜单项提供一个NullPointerException。但现在它同时显示了这两个片段的项目,甚至我已经运行了你给出的导航示例,它运行得非常好。但为什么不是我的呢?我已经改变了图标的可绘制元素,它们的字符串,正如你提到的。对不起,我提供了一个工作示例,你确认它甚至可以在你的端工作。现在,根据您提供的信息,很难猜测它为什么不能在您的项目中发挥作用。要么你需要弄清楚你在做什么,要么给我们更多的信息和你项目的背景。我遵循了exxxaaaccctttt代码。但现在它同时显示了这两个片段的项目,甚至我已经运行了你给出的导航示例,它运行得非常好。但为什么不是我的呢?我已经改变了图标的可绘制元素,它们的字符串,正如你提到的。对不起,我提供了一个工作示例,你确认它甚至可以在你的端工作。现在,根据您提供的信息,很难猜测它为什么不能在您的项目中发挥作用。要么你需要弄清楚你在那里做了什么不同,要么给我们更多的信息和你项目的背景。