8

我有一個活動與多個片段。我也使用actionbarSherlock爲我的標籤也連接到片段。獲取當前的片段並保存onSaveInstanceState()方法屏幕方向

我的問題是當我要旋轉屏幕(即肖像到風景/反之亦然),我的活動將被再次調用,因此它重新開始我的活動。

我不想重新開始我的活動,只是恢復旋轉之前顯示的當前片段。請不要回答android:configChanges="orientation|keyboardHidden",因爲它沒有解決問題,但就像一個簡單的黑客攻擊。我的解決方案是OnsaveInstanceState和onRestoreInstanceState方法,但我只是不知道如何使用它與我的問題。請幫助我這個。任何迴應都非常感謝。

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 

    } 
} 

回答

13

片段將被默認的設備旋轉後可以恢復,如果你不重新添加他們。如果你想要片段看起來相同,那麼你應該在Fragment本身執行onSaveInstanceState。在Activity你可能只是這樣做:

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

即使你沒有在活動覆蓋onSaveInstanceState,恢復一個ActivitysavedInstanceState參數依然會非空。它只是一個空的Bundle

另一種選擇是存儲所選標籤索引的內容,並在活動恢復時重新選擇該標籤。

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

這將重新選擇當前選項卡並顯示正在顯示的Fragment。唯一的缺點是你的片段狀態沒有保存。爲了保存片段的狀態,你必須做一些像第一個解決方案。

+0

我該如何保存我的片段狀態? –

+0

而不是'actionBar.addTab(tabD,0,true);'這樣做:'if(savedInstanceState == null){actionBar.addTab(tabD,0,true);} else {actionBar.addTab(tabD,0,假); }'這應該允許恢復現有片段。您的標籤指示可能已關閉,因此您必須設置指示哪一個。 – MCeley