7

Ich habe einen Bildschirm, der ViewPager + Aktionsleiste Sherlock Tabs verwendet. Ich habe einen setOnPageChangeListener Satz auf dem Pager und es macht folgendes:Actionbar Sherlock - Tabs werden in der Landschaft beim Wischen nicht geändert

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

Das funktioniert im Portrait-Modus ganz gut und auch in der Landschaft, wenn ich nur wenige Registerkarten und alle Registerkarten angezeigt werden. Wenn ich jedoch einige weitere Registerkarten im Querformat hinzufüge, werden diese zu einem einzigen Dropdown-Widget zusammengefasst. Wenn ich den ViewPager durchblättere, wird die Methode setSelectedNavigationItem ausgeführt, aber jetzt hat sie keine Auswirkung auf die Dropdown-Auswahl: sie bleibt auf dem zuletzt ausgewählten Wert. Was wirklich schlimm ist, da dem Benutzer ein visueller Hinweis fehlt: Tab sagt "Eins", aber der Benutzer ist bereits auf Seite 6.

Gibt es eine Möglichkeit, programmgesteuert zu ändern, welche Registerkarte basierend auf der Position angezeigt wird?

P.S. Ich weiß, warum dies geschieht: Hier Code aus com.android.internal.app.ActionBarImpl ist:

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

Und wenn ich durch den Schritt kann ich sehen, dass der Navigationsmodus noch NAVIGATION_MODE_TABS obwohl Tabs als Liste angezeigt werden. Jetzt - meine Knie-Ruck-Reaktion ist es, Code in onConfigurationChanged zu setzen, um den Navigationsmodus entsprechend einzustellen, aber sollte dies nicht automatisch geschehen?

P.P.S. Und es gibt Android bug für sie eingereicht bereits, dass enthält den Patch

Antwort

11

Base auf den Android-Fehler sehen, ich bin Referenzierung in der Frage (siehe PPS) hier ist Workaround, die tatsächlich funktioniert. Fügen Sie es einfach Ihrem Pager hinzu.

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

Diese Lösung funktioniert für die native ActionBar, funktioniert aber nicht für die Kompatibilität (auf einem Gingerbread-Emulator). wie kann das auch behoben werden? –

+0

Danke! Das funktioniert definitiv :-) –

+0

Danke! Endlich eine funktionierende Lösung gefunden. – Ahmad

0

Sie benötigen einen Code in dem ActionBarSherlock Bibliotheksprojekt in Datei hinzufügen (ActionBarImpl.java) this link

+0

Die Korrektur, auf die Sie hingewiesen haben, funktioniert nicht, ich habe es nur überprüft. Der Code wird nur von onConfigurationChanged aufgerufen und ich brauche die ausgewählte Registerkarte geändert, wenn ich von Seite zu Seite wische. – Bostone

+0

Wenn Sie ViewPager als innerhalb seiner Listener verwenden, müssen Sie explizit die ausgewählte Registerkarte festlegen ... Dies ist, was ich in einem der tun Mein Projekt. – aProgrammer