ActionBar ERROR: Navegación de modo de lista no visible después de usar SearchView

Proyecto que demuestra este error: https://github.com/smarek/ActionBar-Navigation-Bug


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


Actualmente estoy enfrentando un problema con ActionBar.

Vamos a tener un ViewPager + PagerTitleStrip y 3 Fragmentos.
Flujo de usuario:

  • Abrir aplicación
  • First Fragment ha establecido el modo de navegación a NAVIGATION_MODE_LIST
    • Otros Fragmentos tiene NAVIGATION_MODE_STANDARD
  • Todos los fragmentos tiene opción de menú opciones con SearchView
  • Ir a la segunda o tercera y abrir la búsqueda (haga clic en el elemento de búsqueda)
  • Cerrar la vista de búsqueda o no (sólo puede desplazarse de nuevo al fragmento anterior)
  • Ir al primer fragmento, y ver, no hay NAVIGATION_MODE_LIST
  • En el primer fragmento, abra la búsqueda y ciérrela
  • La lista de navegación vuelve a aparecer

Agregando sólo el código de MainActivity y el diseño del proyecto es el proyecto de aplicación estándar de Android, minSdk 11, al crear la actividad principal, seleccione la actividad en blanco y deslizar vistas + tira título

Layout / activity_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 / ejemplo / proyecto / 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; } } } 

Error

Estoy publicando esto sólo para señalar la discusión en la dirección del error.

El error está más relacionado con el indicador SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW . Una vez que quite la bandera, todo funcionará perfectamente. Es muy probablemente un error, pero una vez más no estoy seguro si hay una explicación racional.

Solución (no realmente)

Cuando está creando el elemento de menú en onCreateOptionsMenu , elimine el ORed MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW

Simplemente, cambia esto

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

a

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

Bug sin visor

He bifurcado el proyecto y aquí es sin el viewpager con el mismo comportamiento ActionBar-Navigation-Bug

Tuve un problema similar cuando el SearchView tenía establecido el indicador SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW. Mi solución fue expandir y contraer el MenuItem del SearchView después de cambiar a NAVIGATION_MODE_LIST:

 actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_LIST ); actionBar.setDisplayShowTitleEnabled( false ); searchMenuItem.expandActionView(); searchMenuItem.collapseActionView(); 

Es un poco sucio, pero hizo el trabajo para mí.

Btw … El mismo error y solución también se aplica a ActionBarSherlock.

Aquí es cómo conseguí alrededor de este error:

Primero hice el MenuItem global en la actividad:

 private MenuItem searchItem; 

En la actividad tuve el siguiente método:

 public void hideSearch() { MenuItemCompat.collapseActionView(searchItem); } 

Entonces en el método onCreateView () del fragmento llamo a este método, justo antes de devolver la vista. Mi hilandero dejó de estar escondido. Para ser honesto, no estoy seguro de por qué esto funciona, pero lo hizo por mí.

  • Cómo portar la aplicación de Android a la plataforma iOS?
  • OkHttp PublicKey pinning en Android
  • Obtener directorio de un archivo
  • Cómo configurar el color rgb en Android?
  • Optimización del compilador de código Java en Android
  • Obtenga el valor de RemoteMessage del método FCM onMessageReceived
  • Obtener la latitud y la longitud de una posición de clic en un mapas de forja 0.5.1 MapView
  • ¿Por qué no termina esta actividad?
  • Android: Share ¿La intención de la imagen no funciona con Facebook?
  • Crear un menú pero uno de los dos botones no funciona correctamente
  • Findviewbyid devuelve null en un diálogo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.