【问题标题】:Add ActionItems Separately for Each Fragment in a ViewPager为 ViewPager 中的每个 Fragment 分别添加 ActionItem
【发布时间】:2014-08-09 10:18:00
【问题描述】:

在我的MainActivity 中,我正在实施ViewPager,这导致了 2 个片段。问题是我对 ActionItems 把它们放在哪里有点困惑。我想要的是,每当我在片段之间滑动时,每个片段的ActionItems 必须不同。谁能指导我这个。

目前,我没有在 Activity 上添加菜​​单项。但只有 2nd FragmentActionItems 只显示在两个片段上。 这是我的代码:

EDITED

对于第一个片段

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

这是我的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"/>

我在onPageSelected()中也使用过ivalidateOptionMenu(),但没有成功。

【问题讨论】:

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


    【解决方案1】:

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

    经过以下更改,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/menu/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/menu/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>
    

    结果

    【讨论】:

    • 我已关注 exxxaaaccctttt 代码。但现在它同时显示了两个片段的项目。
    • 即使我已经运行了你提供的导航示例,它运行得非常好。但为什么不是我的。
    • 我已经改变了图标的可绘制对象,它们的字符串,正如你提到的那样。
    • 对不起,我提供了一个工作示例,您确认它甚至对您有用。现在,根据您提供的信息很难猜出它为什么不能在您的项目上运行。要么你需要弄清楚你在那里做了什么不同的事情,要么给我们更多的信息和你的项目的背景。
    【解决方案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);
    }
    

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

    【讨论】:

    • 感谢您的回答,让我实现它。
    • 我需要在哪里实现它。因为如果我在我的 Activity 中实现它,它会为菜单项提供 NullPointerException。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多