progetto dimostrando questo bug: https://github.com/smarek/ActionBar-Navigation-BugActionBar ERRORE: Lista modalità di navigazione non è visibile dopo l'utilizzo SearchView
Bugreport su b.android.com: http://code.google.com/p/android/issues/detail?id=51449
che sto attualmente di fronte a un problema con ActionBar.
Disponiamo di un ViewPager + PagerTitleStrip e 3 frammenti. flusso
utente:
- Aprire l'applicazione
- primo frammento è impostare la modalità di navigazione per NAVIGATION_MODE_LIST
- altri frammenti ha NAVIGATION_MODE_STANDARD
- tutti i frammenti ha voce di menu opzioni con SearchView
- Vai alla seconda o alla terza e apri la ricerca (clicca sulla voce di ricerca)
- Chiudi vista di ricerca o meno (si può semplicemente scorrere di nuovo al frammento precedente)
- Vai al primo frammento, e vedere, non v'è alcuna NAVIGATION_MODE_LIST
- Sul primo frammento ricerca aperta e chiudere lista
- navigazione è visibile ancora
Aggiungendo solo il codice di MainActivity e il layout del progetto è il progetto di applicazione standard di Android, minSdk 11, durante la creazione di attività principale, selezionare l'attività vuota e strisciare viste + striscia titolo
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/es/progetto/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;
}
}
}
Ho sentito alcune segnalazioni di problemi con frammenti in un 'ViewPager' che non partecipano correttamente alla barra delle azioni, quindi non sono terribilmente sorpreso dal fatto che si verifichino problemi qui. Cerca su http://b.android.com per vedere se qualcun altro ha segnalato un comportamento simile. Suggerisco anche di caricare un progetto di esempio completo da qualche parte che mostri il problema. – CommonsWare
@CommonsWare grazie per l'attenzione, ho caricato l'intero progetto su GitHub ei collegamenti sono in questione. Non ho ancora trovato un problema simile, ma continuerò a cercare. –
@CommonsWare Sono convinto che questo sia un bug, ho riempito un bug report e ho allegato il link alla parte superiore della mia domanda. –