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
- Cómo puedo establecer un intervalo de minutos en DialogFragment
- cómo decodificar android.os.Build.SERIAL?
- No se puede resolver el símbolo R
- ¿Cómo orientar diferentes arquitecturas Android?
- Descripción de las pérdidas de memoria en la aplicación de Android
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; } } }
- URLConnection con Cookies?
- Android 8 o superior: comprobar los servicios de Google Play
- ¿Puede el ícono de la aplicación en el cuadro de diálogo Construido en la búsqueda puede hacer clic?
- Recortar mapa de bits sin leer todo el mapa de bits primero
- Android restore instance state de un fragmento que está en backstack
- ClassCastException: RestTemplate devuelve Lista <LinkedHashMap> en lugar de List <MymodelClass>
- Llamar a un objeto java guardado a través de JNI desde un hilo diferente
- Android Error Clase ref en clase pre-verificada resuelta a implementación inesperada
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í.
- El span de imagen aparece incluso después de Ellipsize en Android textView
- WebView no muestra JSAlert en dispositivos Lollipop