ActionBar BUG:使用SearchView后,列表模式导航不可见 [英] ActionBar BUG: List mode navigation not visible after using SearchView

查看:234
本文介绍了ActionBar BUG:使用SearchView后,列表模式导航不可见的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

项目演示此错误: https://github.com/smarek/ActionBar-Navigation-Bug

Bugreport b.android.com http:// code.google.com/p/android/issues/detail?id=51449

Bugreport on b.android.com : http://code.google.com/p/android/issues/detail?id=51449

我是目前面临ActionBar的一个问题。

I'm currently facing an issue with ActionBar.

让我们有一个ViewPager + PagerTitleStrip和3个碎片。

用户流程:

Let's have a ViewPager+PagerTitleStrip and 3 Fragments.
User flow:


  • 打开申请

  • First Fragment已将导航模式设为NAVIGATION_MODE_LIST


    • 其他片段有NAVIGATION_MODE_STANDARD

    仅添加MainActivity和布局代码该项目是标准的Android应用程序项目,minSdk 11,在创建主要活动时,选择空白活动并滑动视图+标题栏

    布局/活动_main .xml

    <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >
    
        <!--
        This title strip will display the currently visible page title, as well as the page
        titles for adjacent pages.
        -->
    
        <android.support.v4.view.PagerTitleStrip
            android:id="@+id/pager_title_strip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:background="#33b5e5"
            android:paddingBottom="4dp"
            android:paddingTop="4dp"
            android:textColor="#fff" />
    
    </android.support.v4.view.ViewPager>
    

    com / example / project / MainActivity.java

    // imports ommited
    
    public class MainActivity extends FragmentActivity {
    
        SectionsPagerAdapter mSectionsPagerAdapter;
        ViewPager mViewPager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mSectionsPagerAdapter = new SectionsPagerAdapter(
                    getSupportFragmentManager());
    
            mViewPager = (ViewPager) findViewById(R.id.pager);
            mViewPager.setAdapter(mSectionsPagerAdapter);
    
        }
    
        public static class DummySectionFragment extends Fragment {
    
            public static final String ARG_SECTION_NUMBER = "section_number";
            public static final int MENU_SEARCH = -1;
            protected MenuItem searchItem;
            protected SearchView mSearchView;
    
            public DummySectionFragment() {
                setHasOptionsMenu(true);
            }
    
            /*
            * Initializing menu items, adding only searchItem (aka SearchView in actionview)
            */
            @Override
            public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
                mSearchView = new SearchView(getActivity().getActionBar()
                        .getThemedContext());
                searchItem = menu
                        .add(Menu.NONE, MENU_SEARCH, Menu.NONE, "Search")
                        .setIcon(android.R.drawable.ic_menu_search)
                        .setActionView(mSearchView)
                        .setShowAsActionFlags(
                                MenuItem.SHOW_AS_ACTION_ALWAYS
                                        | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
                super.onCreateOptionsMenu(menu, inflater);
            }
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                TextView textView = new TextView(getActivity());
                textView.setGravity(Gravity.CENTER);
                textView.setText(Integer.toString(getArguments().getInt(
                        ARG_SECTION_NUMBER)));
                return textView;
            }
    
            // Using setUserVisibleHint to operate with actionbar
            // (navigation mode) and visibility of option menu items
            // if isVisibleToUser, we're doing setup for current Fragment
            @Override
            public void setUserVisibleHint(boolean isVisibleToUser) {
                super.setUserVisibleHint(isVisibleToUser);
                if (isVisibleToUser) {
                        // setting navigation mode according to fragment
                    ActionBar ab = getActivity().getActionBar();
                    int mode = 0;
                        // ARG_SECTION_NUMBER is argument with numbers 1, 2, 3
                    switch (getArguments().getInt(ARG_SECTION_NUMBER)) {
                    default:
                    case 1:
                        mode = ActionBar.NAVIGATION_MODE_LIST;
                                // Simple adapter added to spinner, to be visible
                        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(
                                getActivity(),
                                android.R.layout.simple_spinner_dropdown_item,
                                new String[] { "A", "B", "C" });
                        ab.setListNavigationCallbacks(spinnerArrayAdapter,
                                new OnNavigationListener() {
    
                                    @Override
                                    public boolean onNavigationItemSelected(
                                            int itemPosition, long itemId) {
                                        return false;
                                    }
                                });
                        break;
                    case 2:
                    case 3:
                        mode = ActionBar.NAVIGATION_MODE_STANDARD;
                        break;
                    }
                    getActivity().getActionBar().setNavigationMode(mode);
                } else {
                        // resetting navigation mode
                    if (getActivity() != null
                            && getActivity().getActionBar() != null)
                        getActivity().getActionBar().setNavigationMode(
                                ActionBar.NAVIGATION_MODE_STANDARD);
                }
            }
        }
    
        public class SectionsPagerAdapter extends FragmentPagerAdapter {
    
            public SectionsPagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public int getCount() {
                return 3;
            }
    
            @Override
            public Fragment getItem(int position) {
                Fragment fragment = new DummySectionFragment();
                Bundle args = new Bundle();
                args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
                fragment.setArguments(args);
                return fragment;
            }
    
            @Override
            public CharSequence getPageTitle(int position) {
                switch (position) {
                case 0:
                    return getString(R.string.title_section1).toUpperCase();
                case 1:
                    return getString(R.string.title_section2).toUpperCase();
                case 2:
                    return getString(R.string.title_section3).toUpperCase();
                }
                return null;
            }
        }
    
    }
    


    推荐答案

    错误

    Bug

    我发布这个只是为了指向讨论的方向这个bug。

    I am posting this just to point the discussion in the direction of the bug.

    该错误与 SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW 标志更相关。删除标志后,一切都会完美运行。这很可能是一个错误,但我不确定是否有一个合理的解释。

    The bug is more related to the SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW flag. Once you remove the flag, everything will work perfectly. It is most probably a bug but once again I am not sure if there is a rational explanation.

    解决方案 (不是真的)

    Solution (not really)

    你正在 onCreateOptionsMenu 中创建菜单项,删除 ORed MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW

    When you're creating the menu item in onCreateOptionsMenu, remove the ORed MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW

    只需更改此

    searchItem = menu
    .add(Menu.NONE, MENU_SEARCH, Menu.NONE, "Search")
    .setIcon(android.R.drawable.ic_menu_search)
    .setActionView(mSearchView)
    .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS
        | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    

    searchItem = menu
    .add(Menu.NONE, MENU_SEARCH, Menu.NONE, "Search")
    .setIcon(android.R.drawable.ic_menu_search)
    .setActionView(mSearchView)
    .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    

    没有viewpager的错误

    Bug without viewpager

    我已经分叉了项目,这里没有viewpager具有相同的行为 ActionBar-Navigation-Bug

    I have forked the project and here it is without the viewpager with the same behaviour ActionBar-Navigation-Bug

    这篇关于ActionBar BUG:使用SearchView后,列表模式导航不可见的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆