3

Ich verwende ActionBarSherlock und Anwendung this pattern für die Tab-Navigation, die ich auf Android-Entwickler-Website gefunden habe. Es funktioniert ziemlich gut, aber ich möchte auch in der Lage sein, zwischen NAVIGATION_MODE_TABS und NAVIGATION_MODE_LIST zu wechseln, wobei die Verbindung zwischen den Tabs und den Fragmenten erhalten bleibt.Wechseln zwischen Registerkartennavigation und Listennavigation

Das Muster, das ich oben erwähnt habe, ist ziemlich gut für die Erhaltung eines generischen Codes. So füge ich Zuhörer auf meine Tabs und verknüpfen sie mit spezifischen Fragmente wie folgt aus:

bar.addTab(bar.newTab() 
.setText("MyFragment") 
.setTabListener(new TabListener<SomeFragment>(this, "myfargment", SomeFragment.class))); 

und das Fragment instanziiert, wenn das zugehörige Register mit Hilfe von Generika geklickt wird:

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    if (mFragment == null) { 
     mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); 
     ft.add(android.R.id.content, mFragment, mTag); 
    } else { 
     ft.attach(mFragment); 
    } 
} 

Meine Frage ist, Wie kann ich einen ähnlichen Weg erreichen, während Navigieren zwischen meinen Fragmenten mit der Listennavigation Modus. Ich konnte einen ähnlichen Weg nicht finden, da die OnNavigationListener für die Liste auf der ActionBar für die ganze Liste anstelle von pro Stück Basis wie der Tablistener funktioniert.

oder muss ich, so etwas zu tun haben:

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    switch (itemPosition) { 
    case 0: 
    //Replace the current fragment with FragmentA 
     break; 
    case 1: 
    //Replace the current fragment with FragmentB 
     break; 
    case 2: 
    //Replace the current fragment with FragmentC 
     break; 
    default: 
     break; 
    } 
    return true; 
} 

EDIT:

ich ein interessantes Verhalten bemerkt haben: Während die Navigationsmodus-NAVIGATION_MODE_TABS gesetzt, wenn ich gesetzt mein Telefon in Landschaft Modus wandelt es die Registerkarten in eine Liste und Preservers die Verbindung zwischen den Fragmen ts und die Listenelemente (welche waren Registerkartenelemente vor) Wie kann ich dieses Ergebnis erreichen auf Anfrage statt auf Orientierungsänderung?

Antwort

1

Ich glaube nicht, es ist möglich, wenn Sie im Tab-Modus manuell auf eine Listennavigation eingestellt sind. Ich habe die Listennavigation für eine meiner Anwendungen festgelegt, wenn sie unter den "Großen" Bereich fällt. Dies ist, wie ich die Navigation Zuhörer bin mit:

OnNavigationListener mNavigationListener = new OnNavigationListener() 
{ 
int mLastPosition = -1; 

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) 
{ 
    String selectedTag = mFragmentNames.get(itemPosition); 

    FragmentManager fm = getSupportFragmentManager(); 
    Fragment fragment = fm.findFragmentByTag(selectedTag); 
    FragmentTransaction ft = fm.beginTransaction(); 

    /** Used to avoid the same fragment being reattached. */ 
    if(mLastPosition != itemPosition) 
    { 
    /** Means there was a previous fragment attached. */ 
    if(mLastPosition != -1) 
    { 
     Fragment lastFragment = fm.findFragmentByTag(mFragmentNames.get(mLastPosition)); 
     if(lastFragment != null) 
     ft.remove(lastFragment); 
    } 

    if(fragment == null) 
    { 
     /** The fragment is being added for the first time. */ 
     fragment = Fragment.instantiate(HomeActivity.this, selectedTag); 
     ft.add(R.id.rootLayout, fragment, selectedTag); 
     ft.commit(); 
    } else 
    { 
     ft.attach(fragment); 
     ft.commit(); 
    } 
    } 
    /** 
    * The newly attached fragment will be the last position if changed. 
    */ 
    mLastPosition = itemPosition; 

    return true; 
} 
}; 

Die Variable mFragmentNames ist eine HashMap, die eine ganze Zahl Position zu einem Fragment Namen ex abbildet. "com.android.myproject.MyFragment"

Ich hoffe, das hilft.