8

Tôi có một Hoạt động với nhiều Phân đoạn. Tôi cũng đang sử dụng actionbarSherlock cho các tab của mình cũng được kết nối với các đoạn.Lấy phân đoạn hiện tại và lưu trên phương thức onSaveInstanceState() để định hướng màn hình

Vấn đề của tôi là khi tôi xoay màn hình (chân dung thành ngang/ngược lại), hoạt động của tôi sẽ được gọi lại để khởi động lại hoạt động của tôi.

Tôi không muốn khởi động lại hoạt động của mình mà chỉ khôi phục đoạn hiện tại được hiển thị trước khi xoay. XIN VUI LÒNG không trả lời android:configChanges="orientation|keyboardHidden" vì nó không giải quyết được vấn đề nhưng giống như một hack đơn giản của nó. Giải pháp của tôi là OnsaveInstanceState và onRestoreInstanceState Methods nhưng tôi không biết cách sử dụng nó với vấn đề của mình. Xin hãy giúp tôi với cái này. Bất kỳ phản ứng nào được đánh giá cao.

Mã sản phẩm:

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 

    } 
} 

Trả lời

13

Những mảnh vỡ sẽ được phục hồi sau một vòng xoay thiết bị theo mặc định nếu bạn không thêm chúng một lần nữa. Nếu bạn muốn các mảnh trông giống nhau thì bạn nên tự mình thực hiện onSaveInstanceState trong chính số Fragment. Trong Activity bạn chỉ có thể làm điều gì đó như:

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

Thậm chí nếu bạn không ghi đè onSaveInstanceState trong hoạt động này, các tham số savedInstanceState vẫn sẽ không null khi khôi phục một Activity. Nó sẽ chỉ là Bundle trống.

Một tùy chọn khác là lưu trữ chỉ mục tab đã chọn và chọn lại tab đó khi hoạt động của bạn được khôi phục.

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

Điều này sẽ chọn lại tab hiện tại và hiển thị Fragment đang được hiển thị. Nhược điểm duy nhất cho điều này là trạng thái của mảnh vỡ của bạn không được lưu lại. Để lưu trạng thái của mảnh, bạn phải làm một cái gì đó giống như giải pháp đầu tiên.

+0

Làm cách nào để lưu trạng thái phân đoạn của tôi? –

+0

Thay vì 'actionBar.addTab (tabD, 0, true);' làm điều này: 'if (savedInstanceState == null) {actionBar.addTab (tabD, 0, true);} else {actionBar.addTab (tabD, 0, sai); } 'Điều đó sẽ cho phép đoạn hiện có được phục hồi. Chỉ báo tab của bạn có thể bị tắt mặc dù vậy bạn phải đặt chỉ báo nào được chỉ định. – MCeley

Các vấn đề liên quan