2012-11-10 24 views
9

Yêu cầu của tôi là khá đơn giản: Tôi có một nút mà nên thay thế một FragmentA bởi FragmentB.FragmentTransaction.remove không có tác dụng

Điều này nghe có vẻ dễ dàng và gần như hoạt động, vấn đề lớn là đoạn cũ không bị loại bỏ và đoạn mới được đặt ở mặt trước của đoạn cũ và chúng "sống" cùng nhau trong bố cục của tôi.

enter image description here

Bộ luật:

FragmentManager fragMgr = a.getSupportFragmentManager(); 
Fragment currentFragment = (Fragment) fragMgr.findFragmentById(R.id.fragmentitself); 

if(currentFragment!=null){ 

    FragmentTransaction fragTrans = fragMgr.beginTransaction(); 
    fragTrans.remove(currentFragment); 

    FragmentB newFragment = new FragmentB(); 
    fragTrans.replace(R.id.fragmentcontainer, newFragment); 
    // I have also tried with R.id.fragmentitself 
    fragTrans.addToBackStack(null); 
    fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    fragTrans.commit(); 
} 

Các Layout:

<FrameLayout 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="2" 
    android:id="@+id/fragmentcontainer"> 

    <fragment 
     android:id="@+id/fragmentitself" 
     android:name="com.WazaBe.MyApp.FragmentA" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</FrameLayout> 

Trả lời

14

Giải pháp

Trước tiên, bạn phải gỡ bỏ đoạn từ XML và chỉ cần giữ container rỗng có:

<FrameLayout 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="2" 
    android:id="@+id/fragmentcontainer" /> 

Sau đó, bạn cần phải thêm com.WazaBe.MyApp.FragmentA mảnh của bạn từ mã, ví dụ: trong onCreate() của Hoạt động cha mẹ của bạn.

Giải thích

Đó là bởi vì với các giao dịch bạn thao tác ViewGroup như FrameLayouts đó là container cho mảnh vỡ. Nhưng khi bạn đặt Fragment trực tiếp trong bố cục XML, thì nó sẽ trở thành vĩnh viễn một phần của cấu trúc phân cấp Xem và bởi vì nó là vĩnh viễn, nó không thể bị xóa khỏi mã.

Khi bạn được bố trí của bạn cố định, cuộc gọi remove() không còn cần thiết - nó sẽ đủ để chỉ làm replace()

+0

làm việc! Cảm ơn. –

5

Nếu bạn muốn đặt một Fragment trong một Xem container (Chẳng hạn như một Framelayout), bạn phải đảm bảo rằng vùng chứa của bạn trống (chỉ bạn có thể đặt một đoạn vào đó) .bạn không thể thay thế một đoạn được ghi trong tệp XML, bạn nên thêm A vào vùng chứa theo mã JAVA và khi bạn không tạo id, bạn có thể thay thế nó bằng B;

lúc đầu, container của bạn là empyt:

<FrameLayout 
android:layout_width="0dp" 
android:layout_height="match_parent" 
android:layout_weight="2" 
android:id="@+id/fragmentcontainer"> 
</FrameLayout> 

OK, bạn đặt FragmentA vào nó:

FragmentTransaction fragTrans = fragMgr.beginTransaction(); 
fragTrans.remove(currentFragment); 
FragmentA fragA= new FragmentA(); 
fragTrans.add(R.id.fragmentcontainer, fragA).commit(); 

BÂY GIỜ, nếu bạn muốn thay thế:

FragmentTransaction fragTrans = fragMgr.beginTransaction(); 
FragmentB newFragment = new FragmentB(); 
fragTrans.replace(R.id.fragmentcontainer, newFragment); 
// I have also tried with R.id.fragmentitself 
fragTrans.addToBackStack(null); 
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
fragTrans.commit(); 
+0

Xin lỗi, anh chàng kia nhanh hơn, cảm ơn rất nhiều câu trả lời. –

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