7

Ho uno schermo che utilizza le schede Sherlock della barra delle azioni di ViewPager +. Ho una serie setOnPageChangeListener sul cercapersone e lo fa il seguente:Barra delle applicazioni Sherlock - le schede non cambieranno in orizzontale quando si fa scorrere lo schermo

@Override 
public void onPageSelected(final int position) { 
    actionBar.setSelectedNavigationItem(position); 
} 

Questo funziona bene in modalità verticale e anche nel paesaggio se ho solo poche schede e vengono visualizzate tutte le schede. Tuttavia, se aggiungo alcune altre schede in orizzontale, queste vengono compresse in un singolo widget a discesa. Quando sfoglio il ViewPager, il metodo setSelectedNavigationItem viene eseguito ma ora non ha alcun effetto sulla selezione del menu a discesa: rimane nell'ultimo valore selezionato. Il che è davvero pessimo in quanto all'utente manca un indizio visivo: la scheda potrebbe dire "Uno" ma l'utente è già sulla pagina # 6.

C'è un modo per cambiare a livello di programmazione quale scheda visualizzare in base alla posizione?

P.S. Io so perché questo accade: Ecco il codice da com.android.internal.app.ActionBarImpl:

public void setSelectedNavigationItem(int position) { 
    switch (mActionView.getNavigationMode()) { 
    case NAVIGATION_MODE_TABS: 
     selectTab(mTabs.get(position)); 
     break; 
    case NAVIGATION_MODE_LIST: 
     mActionView.setDropdownSelectedPosition(position); 
     break; 
    default: 
     throw new IllegalStateException(
       "setSelectedNavigationIndex not valid for current navigation mode"); 
    } 
} 

E quando faccio un passo attraverso che posso vedere che la modalità di navigazione è ancora NAVIGATION_MODE_TABS se le schede vengono visualizzate come lista. Ora - la mia reazione istintiva è di mettere il codice in onConfigurationChanged per impostare correttamente la modalità di navigazione, ma questo non dovrebbe accadere automaticamente?

P.P.S. E c'è Android bug ha presentato istanza di già che contiene la patch

risposta

11

Base sul bug Android sto riferimento nel domanda (vedi PPS) ecco la soluzione che funziona davvero. Aggiungilo al tuo cercapersone

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() 
    { 
     @Override 
     public void onPageSelected(int position) 
     { 
      actionBar.getTabAt(position).select(); 
      ViewParent root = findViewById(android.R.id.content).getParent(); 
      findAndUpdateSpinner(root, position); 
     } 

     /** 
     * Searches the view hierarchy excluding the content view 
     * for a possible Spinner in the ActionBar. 
     * 
     * @param root The parent of the content view 
     * @param position The position that should be selected 
     * @return if the spinner was found and adjusted 
     */ 
     private boolean findAndUpdateSpinner(Object root, int position) 
     { 
      if (root instanceof android.widget.Spinner) 
      { 
       // Found the Spinner 
       Spinner spinner = (Spinner) root; 
       spinner.setSelection(position); 
       return true; 
      } 
      else if (root instanceof ViewGroup) 
      { 
       ViewGroup group = (ViewGroup) root; 
       if (group.getId() != android.R.id.content) 
       { 
       // Found a container that isn't the container holding our screen layout 
       for (int i = 0; i < group.getChildCount(); i++) 
       { 
        if (findAndUpdateSpinner(group.getChildAt(i), position)) 
        { 
         // Found and done searching the View tree 
         return true; 
        } 
       } 
       } 
      } 
      // Nothing found 
      return false; 
     } 
    }); 
+0

questa soluzione funziona per ActionBar nativo ma non funziona per quella di compatibilità (su un emulatore Gingerbread). come può essere risolto anche questo? –

+0

Grazie! Questo funziona sicuramente :-) –

+0

Grazie! Finalmente trovato una soluzione funzionante. – Ahmad

0

è necessario aggiungere un po 'di codice nel progetto di libreria ActionBarSherlock nel file (ActionBarImpl.java) vedi this link

+0

La correzione che hai indicato non funziona, l'ho appena controllato. Il codice viene richiamato solo da onConfigurationChanged e tuttavia ho bisogno di una scheda selezionata modificata quando si scorre da una pagina all'altra – Bostone

+0

Se si utilizza ViewPager piuttosto che all'interno del listener, è necessario impostare in modo esplicito la scheda ... Questo è ciò che faccio in uno di il mio progetto. – aProgrammer

Problemi correlati