8

Birden Parçası Düşen bir Etkinliği açıksa için onSaveInstanceState() Metodu tasarruf edin. Ayrıca parçalara da bağlı olan sekmelerim için actionbarSherlock kullanıyorum.Güncel Parçası alın ve Ekran Oryantasyon

My Problem bu benim aktiviteyi yeniden yüzden, benim etkinlik tekrar çağrılır (yani yatay/tersi yönde portresi) ekranını döndürmek için gidiyorum zamandır.

benim faaliyeti yeniden ama sadece döndürme önce gösterildi geçerli parçasını geri istemiyorlar. LÜTFEN sorunu çözmediğinden, sadece basit bir hack gibi android:configChanges="orientation|keyboardHidden" yanıt vermeyin. Benim çözüm OnsaveInstanceState ve onRestoreInstanceState Yöntemleri oldu ama ben sadece benim sorunumla nasıl kullanacağımı bilmiyorum. Lütfen bana yardım et. Herhangi bir cevap çok takdir edilmektedir.

KODU: Onları tekrar katmayan eğer

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 

    } 
} 

cevap

13

fragmanlar, varsayılan olarak bir cihaz rotasyon sonrasında restore edilecek. Parçacıkların aynı görünmesini istiyorsanız, onSaveInstanceState'u Fragment'un kendisinde gerçekleştirmelisiniz. Activity yılında sadece böyle bir şey yapabileceğini: Bir Activity geri yüklerken aktivitesinde onSaveInstanceState geçersiz kılmaz bile

@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. 
     */ 
    } 
} 

, savedInstanceState parametre hala boş olmayan olacaktır. Sadece boş bir Bundle olacak.

Diğer bir seçenek, seçilen sekme dizini ve etkinlik geri geldiğinde o sekmeyi tekrar seçin ne saklamak olacaktır.

@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 */ 
    } 
} 

Bu akım sekmeyi tekrar seçin ve gösterilen ediliyordu Fragment gösterirdi. Bunun tek dezavantajı, parçanızın devletinin kurtarılmamasıdır. Parçanın durumunu kaydetmek için, ilk çözüm gibi bir şey yapmak zorundasınız.

+0

Parçamın durumunu nasıl kaydederim? ; Yerine 'actionBar.addTab (doğru TABD, 0,) arasında –

+0

' bunu: 'halinde (savedInstanceState == null) {actionBar.addTab (gerçek TABD, 0,)} else {actionBar.addTab (TABD, 0, yanlış); } 'Bu mevcut parçanın geri yüklenmesine izin vermelidir. Sekme göstergeniz kapalı olabilir, dolayısıyla hangisinin belirtileceğini ayarlamanız gerekir. – MCeley