2012-06-22 27 views
14

Tôi đang tạo một ứng dụng phân đoạn nhiều hoạt động. Tôi thêm vào backstack sau mỗi giao dịch. Sau khi một vài ẩn và hiển thị các mảnh vỡ và sau đó tôi xoay điện thoại, tất cả các mảnh vỡ được thêm vào thùng chứa đã được khôi phục và mọi mảnh vỡ đều nằm trên đầu kia.các đoạn backstack ẩn được hiển thị lại trên thay đổi cấu hình

Điều gì có thể là vấn đề? Tại sao hoạt động của tôi lại hiển thị các mảnh vỡ mà tôi đã ẩn trước đó?

Tôi đang nghĩ đến việc ẩn tất cả các phân đoạn đã được ẩn trước đây, nhưng lại có cách làm duyên dáng hơn?

+0

Chỉ cần lưu ý, mảnh vỡ ẩn đã được lưu giữ trong các thùng chứa như vô hình. Vì vậy, việc thay đổi cấu hình có thể hiển thị lại chúng vì chúng đã ở đó. – zgulser

Trả lời

0

Bạn có thể muốn thử sử dụng hàm replace() thay vì ẩn và hiển thị. Tôi đã gặp vấn đề tương tự khi tôi bắt đầu sử dụng Fragments và sử dụng chức năng thay thế thực sự đã giúp quản lý tốt hơn Fragments. Dưới đây là ví dụ nhanh:

fragmentManager.replace(R.id.fragmentContainer, desiredFragment, DESIRED_FRAGMENT_TAG)         
       .addToBackStack(null) 
       .commit(); 
9

Sử dụng setRetainInstance(true) trên mỗi đoạn và vấn đề của bạn sẽ biến mất.
Cảnh báo: đặt điều này thành đúng sẽ thay đổi vòng đời Fragments.
Trong khi setRetainInstance(true) giải quyết sự cố, có thể có những trường hợp bạn không muốn sử dụng. Để khắc phục điều đó, thiết lập một thuộc tính boolean trên Fragment và khôi phục khả năng hiển thị:

private boolean mVisible = true; 
@Override 
public void onCreate(Bundle _savedInstanceState) { 
    super.onCreate(_savedInstanceState); 
    if (_savedInstanceState!=null) { 
     mVisible = _savedInstanceState.getBoolean("mVisible"); 
    } 
    if (!mVisible) { 
     getFragmentManager().beginTransaction().hide(this).commit(); 
    } 
    // Hey! no setRetainInstance(true) used here. 
} 
@Override 
public void onHiddenChanged(boolean _hidden) { 
    super.onHiddenChanged(_hidden); 
    mVisible = !_hidden; 
} 
@Override 
public void onSaveInstanceState(Bundle _outState) { 
    super.onSaveInstanceState(_outState); 
    if (_outState!=null) { 
     _outState.putBoolean("mVisible", mVisible); 
    } 
} 

Khi thay đổi cấu hình (ví dụ như hướng màn hình), các trường hợp sẽ bị phá hủy, nhưng Bundle sẽ được lưu trữ và tiêm vào ví dụ Fragment mới.

2

Tôi đã gặp vấn đề tương tự. bạn nên kiểm tra mã nguồn trong hàm onCreateView() của hoạt động của bạn.

public class MainActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    setContentView(R.layout.activity_main); 

    if(savedInstanceState == null){//for the first time 

     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     FragmentExample fragment = new FragmentExample(); 
     fragmentTransaction.add(R.id.layout_main, fragment); 
     fragmentTransaction.commit(); 

    }else{//savedInstanceState != null 
     //for configuration change or Activity UI is destroyed by OS to get memory 
     //no need to add Fragment to container view R.id.layout_main again 
     //because FragmentManager supported add the existed Fragment to R.id.layout_main if R.id.layout_main is existed. 
     //here is one different between Fragment and View 

    } 
} 

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/layout_main"> 

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