13

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

} 
+0

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

+0

@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. –

+0

@CommonsWare Sono convinto che questo sia un bug, ho riempito un bug report e ho allegato il link alla parte superiore della mia domanda. –

risposta

5

Bug

sto postando questo solo per puntare la discussione nella direzione del b ug.

Il bug è più correlato al flag SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW. Una volta rimossa la bandiera, tutto funzionerà perfettamente. Probabilmente è un bug ma ancora una volta non sono sicuro che ci sia una spiegazione razionale.

Solution (non proprio)

Quando si crea la voce di menu in onCreateOptionsMenu, rimuovere il ORedMenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW

Semplicemente, cambiare questa

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 senza viewpager

ho biforcuta il progetto e qui è senza il viewpager con lo stesso comportamento ActionBar-Navigation-Bug

+0

@MarekSebera Hai provato la sua soluzione con il tuo progetto? – PravinCG

+1

@MarekSebera Grazie per l'aggiornamento, questo garantisce che gli altri non passino il tempo a provarlo. – PravinCG

+0

@MarekSebera sul mio telefono ics, rimuovendolo risolto il problema –

4

ho avuto un problema simile quando il SearchView aveva lo SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW flag set . La mia soluzione era quella di espandere e comprimere l'MenuItem del SearchView dopo il passaggio alla NAVIGATION_MODE_LIST:

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

E 'tipo di sporco, ma ha fatto il lavoro per me.

Btw ... Lo stesso bug e soluzione si applica anche a ActionBarSherlock.

+0

Bene, testerò questa soluzione al più presto e tornerò da te. –

+0

@Moritz questa soluzione alternativa causa l'apertura della tastiera su galaxy s4 veloce durante l'esecuzione. La chiusura manuale non aiuta –

+0

Questo ha funzionato per me. Sono preoccupato per il commento di Lazy Beard, ma ho notato che questo bug non si verifica su 4.4 per me quindi ho escluso la soluzione alternativa alla 4.2 e al di sotto. –

0

Ecco come ho ottenuto tutto questo bug:

Per prima cosa ho fatto l'MenuItem globale nell'attività:

private MenuItem searchItem; 

Nell'attività ho avuto il seguente metodo:

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

Quindi nel metodo onCreateView() del frammento chiamo questo metodo, appena prima di restituire la vista. Il mio spinner ha poi smesso di essere nascosto. Ad essere onesti, non sono sicuro del motivo per cui questo funziona, ma lo ha fatto per me.

Problemi correlati