8

Ich habe eine Aktivität mit mehreren Fragmenten. Ich benutze auch ActionbarSherlock für meine Tabs, die auch mit Fragmenten verbunden sind.Abrufen des aktuellen Fragments und Speichern der onSaveInstanceState() - Methode für die Bildschirmausrichtung

Mein Problem ist, wenn ich den Bildschirm drehen werde (das ist Porträt in Landschaft/umgekehrt), meine Aktivität wird wieder aufgerufen, so dass es meine Tätigkeit neu startet.

Ich möchte meine Aktivität nicht neu starten, sondern nur das aktuelle Fragment wiederherstellen, das vor dem Drehen angezeigt wurde. Bitte antworten Sie nicht android:configChanges="orientation|keyboardHidden", da es das Problem nicht gelöst hat, sondern nur wie ein einfacher Hack davon. Meine Lösung war OnsaveInstanceState und OnRestoreInstanceState Methoden, aber ich weiß einfach nicht, wie ich es mit meinem Problem verwenden soll. Bitte hilf mir dabei. Jede Antwort wird sehr geschätzt.

Code:

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    ActionBar.Tab tabA = actionBar.newTab().setIcon(R.drawable.about); 
    ActionBar.Tab tabE = actionBar.newTab().setIcon(R.drawable.faq); 
    ActionBar.Tab tabB = actionBar.newTab().setIcon(R.drawable.sponsors); 
    ActionBar.Tab tabC = actionBar.newTab().setIcon(R.drawable.map); 
    ActionBar.Tab tabD = actionBar.newTab().setIcon(R.drawable.destination); 
    Fragment aboutTab = new PhotosActivity(); 
    Fragment sponsorTab = new SongsActivity(); 
    Fragment mapTab = new HCCMapActivity(); 
    Fragment questTab = new FaqActivity(); 
    Fragment DestinationTab = new TourActivity(); 
    tabA.setTabListener(new MyTabsListener(aboutTab)); 
    tabB.setTabListener(new MyTabsListener(sponsorTab)); 
    tabC.setTabListener(new MyTabsListener(mapTab)); 
    tabD.setTabListener(new MyTabsListener(DestinationTab)); 
    tabE.setTabListener(new MyTabsListener(questTab)); 
    actionBar.addTab(tabD, 0, true); 
    actionBar.addTab(tabC, 1, false); 
    actionBar.addTab(tabA, 2, false); 
    actionBar.addTab(tabB, 3, false); 
    actionBar.addTab(tabE, 4, false); 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    // Save UI state changes to the savedInstanceState. 
    // This bundle will be passed to onCreate if the process is 
    // killed and restarted. 
    savedInstanceState.putString("MyString", "Welcome back to Android"); 
    //savedInstanceState.putString("id",) 
    // etc. 
    //getSupportFragmentManager().putFragment(savedInstanceState, "fragment", getSupportFragmentManager().findFragmentById(R.id.fragment_place)); 
} 


@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    FragmentManager fragmentManager ; 
    FragmentTransaction ft ; 
    super.onRestoreInstanceState(savedInstanceState); 
    // Restore UI state from the savedInstanceState. 
    // This bundle has also been passed to onCreate. 
    String myString = savedInstanceState.getString("MyString"); 
    Log.i("Hello", myString); 

    fragmentManager = getSupportFragmentManager(); 
    ft = fragmentManager.beginTransaction(); 
    ft.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_out_right); 
    ft.replace(R.id.fragment_place, getSupportFragmentManager().getFragment(savedInstanceState, "fragment"), null); 
} 

@Override 
public void onConfigurationChanged (Configuration newConfig){ 
    Log.i("hello", "Config"); 
    super.onConfigurationChanged(newConfig); 
} 

@Override 
public boolean onPrepareOptionsMenu (Menu menu) { 
    //MenuItem menuitem1 = menu.findItem(R.id.menuitem1); 
    //menuitem1.setVisible(false); 

    menu.getItem(1).setVisible(false); 
    menu.getItem(0).setVisible(false); 
    return true; 
} 


protected class MyTabsListener implements TabListener{ 

    Fragment fragment; 

    public MyTabsListener(Fragment fragment){ 

     this.fragment = fragment; 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) {   
     if (myTabPosition < 0){ 
      //ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); 
     }else{ 
      if (myTabPosition > tab.getPosition()){ 
       ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); 
      }else{ 
       ft.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_out_right); 
      } 
     } 
     myTabPosition = tab.getPosition(); 
     ft.replace(R.id.fragment_place, fragment, null);  
     //ft.commit(); 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
     ft.remove(fragment); 
     getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 
} 

Antwort

13

Fragmente werden nach einer Gerätedrehung standardmäßig wiederhergestellt werden, wenn Sie sie nicht wieder hinzufügen. Wenn Sie wollen, dass die Fragmente gleich aussehen, dann sollten Sie Ihre onSaveInstanceState in der Fragment selbst durchführen. Im Activity konnte man nur so etwas wie:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(savedInstanceState == null) { 
     /* First launch, add fragments */ 
    } else { 
     /* 
      Activity restored, don't add new fragments or in your case, 
      don't make the first tab selected. 
     */ 
    } 
} 

Auch wenn Sie nicht onSaveInstanceState der Tätigkeit außer Kraft setzen, die savedInstanceState Parameter noch nicht null sein, wenn eine Activity wiederherzustellen. Es wird nur eine leere Bundle sein.

Eine andere Option wäre, den ausgewählten Registerkartenindex zu speichern und diese Registerkarte erneut auszuwählen, wenn Ihre Aktivität wiederhergestellt wird.

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt("CurrentTab", currentTabIndex); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    /* Your existing code */ 

    if(savedInstanceState != null) { 
     int currentTab = savedInstanceState.getInt("CurrentTab", 0); 
     /* Set currently selected tab */ 
    } 
} 

Dies würde erneut wählen Sie den aktuellen Tab und zeigen die Fragment, die gezeigt wurde. Der einzige Nachteil ist, dass der Status Ihres Fragments nicht gespeichert wird. Um den Status des Fragments zu speichern, müssten Sie etwas wie die erste Lösung tun.

+0

Wie kann ich den Zustand meines Fragments speichern? –

+0

Anstelle von actionBar.addTab (tabD, 0, true); tun Sie dies: 'if (savedInstanceState == null) {actionBar.addTab (tabD, 0, true);} else {actionBar.addTab (tabD, 0, falsch); } Das sollte ermöglichen, dass das vorhandene Fragment wiederhergestellt wird. Die Tab-Anzeige ist möglicherweise deaktiviert, Sie müssen also festlegen, welche angezeigt wird. – MCeley

Verwandte Themen