6

Hiện tại tôi đã có một thùng chứa "RELATIVE_LAYOUT" mà tôi đang sử dụng để thêm đoạn của tôi. Tôi đang sử dụng OnClickListener trên một nút để tải bố cục XML phân đoạn vào vùng chứa RelativeLayout.Làm cách nào để thêm/xóa Phân đoạn khi nhấp vào Nút?

Điều tôi muốn đạt được là khi tôi nhấn nút một lần, phân đoạn sẽ tải ... và khi tôi nhấn lại lần nữa, mảnh cần được loại bỏ. Tôi đã thử sử dụng số nguyên để xác định xem phân đoạn có được tải hay không, nhưng không thành công. Bất kỳ trợ giúp đánh giá cao ...

Mã sản phẩm:

public class MainActivity extends Activity { 
    Button B1,B2; 
    int boolb1=0, boolb2=0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     B1 = (Button)findViewById(R.id.btn1); 
     B2 = (Button)findViewById(R.id.btn2); 

     B1.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       FragmentManager fm = getFragmentManager(); 
       FragmentTransaction ft = fm.beginTransaction(); 
       FragmentOne f1 = new FragmentOne(); 

       if(boolb1==0) 
       {ft.add(R.id.frg1, f1); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       boolb1=1;} 
       else 
       {ft.remove(f1); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
       boolb1=0;} 
       //ft.addToBackStack("f1"); 
       ft.commit(); 
      } 
     }); 

     B2.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       FragmentManager fm = getFragmentManager(); 
       FragmentTransaction ft = fm.beginTransaction(); 
       FragmentTwo f2 = new FragmentTwo(); 

       if(boolb2==0) { 
        ft.add(R.id.frg2, f2); 
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        boolb2=1; 
       } else { 
        ft.remove(f2); 
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
        boolb2=0; 
       } 

       //ft.addToBackStack("f2"); 
       ft.commit(); 
      } 
     }); 
    } 

Trả lời

12

vấn đề của bạn là bạn tạoFragment mọi mới bạn nhấp vào Button. Bạn cần phải lấy một tham chiếu đến sốFragment và sau đó xóa số đó.

Ngoài ra, bạn không cần sử dụng cờ nữa. Khi thêm số Fragment, bạn có thể thẻ. Khi xóa Fragment, bạn có thể sử dụng thẻ được sử dụng để thêm Fragment để tham chiếu đến số hiện tại được thêm Fragment.

Dưới đây là một ví dụ về cách bạn nên làm điều đó:

private Button B1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    B1 = (Button)findViewById(R.id.btn1); 

    B1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      FragmentManager fm = getFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 
      FragmentOne f = (FragmentOne) fm.findFragmentByTag("tag"); 

      if(f == null) { // not added 
       f = new FragmentOne(); 
       ft.add(R.id.frg1, f, "tag"); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 

      } else { // already added 

       ft.remove(f); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
      } 

      ft.commit(); 
     } 
    }); 

    // and so on ... 
} 
+0

Vâng, tôi sẽ chỉ thêm rằng cách tiếp cận tốt hơn là để loại bỏ hoàn toàn "bổ sung" biến và chỉ quyết định bởi presention của mảnh vỡ trong quản lý mảnh .. trong trường hợp đó bạn sẽ có ít công việc khôi phục trạng thái sau khi xoay màn hình – Billda

+0

Bạn nói đúng, tôi đã điều chỉnh mã :) –

+0

Câu trả lời xuất sắc ... mặc dù vậy, khi lần đầu tiên tôi nhấn nút, java sẽ tạo một đối tượng FragmentOne f1 và chuyển cho nó giá trị được trả về bởi findFragmentByTag, nhưng thẻ "tag" chưa được liên kết với bất kỳ đoạn nào kể từ khi chúng ta làm điều đó trong khối if. Vì vậy, không nên tạo ra một lỗi ??? – Abhi9

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