2012-03-28 29 views
7

Tôi có bố cục cho chế độ ngang hiển thị một ListView ở bên trái và FrameLayout ở bên phải. Khi một mục được chọn từ danh sách đoạn khác được thêm vào FrameLayoutKhông thể xóa một đoạn khỏi FrameLayout?

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
if (myFragment == null) { 
    myFragment = new MyFragment(uri); 
    ft.replace(R.id.myFrameLayout, playerFragment); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commitAllowingStateLoss(); 
} 

Sau đó tôi nhấn Delete trong giao diện danh sách và loại bỏ các mục cuối cùng trong danh sách, và tôi cố gắng để loại bỏ các mảnh vỡ để không có gì được hiển thị, nhưng nó không hoạt động, đoạn của tôi vẫn còn trên màn hình. Mã để xóa là:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
ft.remove(myFragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
ft.commitAllowingStateLoss(); 

Mọi ý tưởng tại sao mã này không bị xóa khỏi Chế độ xem?

+3

Tôi gặp vấn đề tương tự. Có đạt được bất kỳ giải pháp nào không? – Jared

Trả lời

3

bạn có khai báo phân đoạn trong xml không? Trích dẫn Dianne Hackborn từ google:

Xác định các đoạn trong XML chủ yếu dành cho những thứ sắp lưu lại. Nếu bạn đang sẽ thêm và xóa, bạn có thể nhất thiết phải làm điều đó một cách tự động.

hy vọng nó sẽ giúp

+0

Tôi nghĩ anh ấy đang đề cập đến việc sử dụng thẻ trong bố cục XML. Tôi không sử dụng nó, tôi đang sử dụng FrameLayout như một trình giữ chỗ và tự động cập nhật đoạn được đưa vào đó. Tôi có thể thử sử dụng phương thức FragmentTransaction.hide() đã được đề cập trong chuỗi mà bạn đã tham chiếu. – DaveJohnston

+0

Vâng API này chỉ là xấu. Bạn thực hiện một cuộc gọi đơn giản 'remove()' và điều cơ bản mà bạn mong đợi nó thực hiện không hoạt động. – milosmns

+0

Nó hoạt động cho các đoạn được thêm vào với một giao dịch rõ ràng, do bạn lập trình. – Blackbelt

0

Khi Bạn tìm kiếm mảnh vỡ của bạn bằng cách Id bạn có tài liệu tham khảo để chứa đoạn không mảnh riêng của mình. Sử dụng TAG khi bạn addiing mảnh và sau đó tìm kiếm bằng cách TAG:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("yourTag"); 
11

@DaveJohnston Tôi đã thử code của bạn cho đoạn remove tôi chỉ đúc .... thanks :)

Hey Tôi không biết điều này là giải pháp cho vấn đề của bạn hay không nhưng bạn thử cách này nó sẽ làm việc:

cách tiếp cận để thêm đoạn:

YourFragment yourFrament; 

//Add your Fragment 
public void addYourFragment(){ 
yourFragment = new YourFragment(); 

FragmentTransaction transation = getSupportFragmentManager().beginTransaction(); 
transation.replace(R.id.yourFlowLayout, yourFragment); 

     transation.commit(); 

} 

Cách tiếp cận để loại bỏ Fragment:

//Remove Fragment 
    public void removeYourFragment(){ 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      if (yourFragment != null) {   
       transaction.remove(yourFragment); 
       transaction.commit(); 
       transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
       yourFragment = null; 
      } 
    } 
+0

điều gì sẽ xảy ra nếu tôi viết transaction.remove (null)? nó sẽ loại bỏ phần lớn nhất trong ngăn xếp? hoặc điều gì sẽ xảy ra? –

0

Tôi đã có một thời gian rất khó khăn để tìm một SO tham khảo về vấn đề này xảy ra khi không thiết lập <fragment> qua XML, nhưng thực sự thiết lập mỗi Fragment động với FragmentTransaction<FrameLayout>.

Đơn giản hóa giải pháp của Gru, giải pháp cho giải pháp của tôi là chỉ cần thêm .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) vào giao dịch thay thế của tôi và nó đã hoạt động! Các phân đoạn trước đây thực sự bị ẩn khỏi chế độ xem.

Tôi tưởng tượng các chuyển đổi khác cũng sẽ hoạt động.

0
private static String TAG_FRAGMENT="MyFragment"; 
MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
if (myFragment == null) { 
     myFragment = new MyFragment(uri); 
    ft.replace(R.id.myFrameLayout, playerFragment,TAG_FRAGMENT); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(TAG_FRAGMENT); 
    ft.commit(); 
} 

khi thay thế đoạn của bạn để sử dụng phương pháp ft.addToBackStack(null) sau khi dễ dàng xóa đoạn của bạn.

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); 

if(fragment != null) 
getSupportFragmentManager().beginTransaction().remove(fragment).commit(); 
0

Nếu bạn có một Fragment rằng không được lấy ra trên thay thế Fragment trong FrameLayout? bạn có thể loại bỏ nó bằng cách cam kết chuyển đổi loại bỏ riêng biệt với FragmentTransaction.TRANSIT_FRAGMENT_CLOSE trên nó trước khi một cuộc gọi đến cam kết thay thế thường xuyên.

Fragment removeThisFragment;//Keep a reference to the fragment you want to remove 
... 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 

// This fragment "sometimes" do not get replaced so we remove it here if it's added. 
     if(removeThisFragment!=null&&removeThisFragment.isAdded()) { 
      transaction = fragmentManager.beginTransaction(); 
      transaction.remove(removeThisFragment); 
      transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
      transaction.commitAllowingStateLoss(); 
     } 

     // update the main content by replacing fragments 
     transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.content_frame, fragment, TAG_MAIN_FRAGMENT).commit(); 

Nhưng tôi khuyên bạn nên tìm hiểu lý do tại sao Fragment không được thay thế ngay từ đầu, kiểm tra xem nó có hoạt động nặng hay không. nhưng nếu bạn cần sửa chữa tạm thời nhanh, hãy thử mã trên.

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