2014-09-19 17 views
14

Tôi đang gặp phải một vấn đề lạ, trong khi sử dụng Fragments và popping lại chúng.Fragment PopBackStack

tôi có một Fragment Hoạt động:

Bước 1: Tôi gắn một Fragment trong onCreate của Hoạt động rằng trong thời gian bắt đầu được đặt tên Fragment A như:

Đây là onCreate của Fragment Hoạt động

@Override 
    protected void onCreate(Bundle savedBundleState) { 
     super.onCreate(savedBundleState); 
     setContentView(R.layout.activity_base_new); 

     Fragement_Home home = new Fragement_Home(); 
     FragmentManager manager = getSupportFragmentManager(); 
     manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit(); 
    } 

Bước 2: sau đó I kèm theo thay thế Fragment với đoạn mã sau:

Fragment_More moreFragment = new Fragment_More(); 
      FragmentManager manager = getSupportFragmentManager(); 
      manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit(); 

Bước 3: Sau đó một lần nữa tôi bổ sung thêm một Fragment trên Fragment_More trong cùng một cách:

Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand(); 
      getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit(); 

và đây là Hoạt động onBackPressedButton Lisetener Fragment của tôi:

@Override 
public void onBackPressed() { 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment f = fm.findFragmentById(R.id.frameContent); 

if(fm.getBackStackEntryCount() > 1){ 
     fm.popBackStack(); 
    } else{ 
     finish(); 
    } 
} 

Đây là vấn đề mà tôi đang nhận được:

Khi tôi nhấn trở lại từ Bước 3, nó cho tôi mảnh vỡ trước đó thành công như được mô tả bởi trên BackPressed, nó sẽ popbackstack và sẽ đưa tôi đến Fragment trước đó. Nhưng từ Fragment_More, khi tôi nhấn lại lần nữa, nó cho tôi thấy nội dung FRAGMENT trống. Nó không bao giờ cho thấy Fragment đầu tiên mà tôi đã thêm vào Bước 1 trong OnCreate of the Activity.

Vui lòng nhận xét. Tôi đang làm gì sai?

Cảm ơn

+0

Bạn có thể cung cấp cho chúng tôi các lớp phân đoạn cho các đoạn bạn sử dụng không? –

+0

Tôi thực sự không thể nhìn thấy bất cứ điều gì sai, trên thực tế tôi đã sao chép những gì bạn mô tả (càng nhiều càng tốt) và nó hoạt động tốt. Tôi đoán có gì đó trong mã bạn không hiển thị .. Tôi lưu ý rằng bạn đang thay đổi một đoạn trong hoạt động từ bên trong một đoạn khác có thể dẫn đến rắc rối (bạn có thể muốn suy nghĩ về cách sử dụng người nghe từ hoạt động của mình). –

+0

kiểm tra http://stackoverflow.com/questions/32132623/onback-pressed-data-not-showing-in-fragments –

Trả lời

38

Bạn không nên thêm đoạn đầu tiên vào hậu trường, khi nhấn phím quay lại sẽ đảo ngược hành động bạn đã thực hiện. Vì vậy, nếu bạn thay thế một mảnh và bạn nhấn trở lại, nó sẽ đảo ngược thay thế bạn đã làm. Nhưng nếu bạn nhấn trở lại một đoạn mã '.add()', nó sẽ đơn giản xóa nó và hiển thị cho bạn một trang trống. Vì vậy, tôi nghĩ rằng việc loại bỏ các mảnh đầu tiên từ backstack nên làm các trick. Hãy thử và cho tôi biết!

@Override 
    protected void onCreate(Bundle savedBundleState) { 
     super.onCreate(savedBundleState); 
     setContentView(R.layout.activity_base_new); 

     Fragement_Home home = new Fragement_Home(); 
     FragmentManager manager = getSupportFragmentManager(); 
     manager.beginTransaction().add(R.id.frameContent, home).commit(); 
    } 

VÍ DỤ:

Vì vậy, giả sử bạn có hai mảnh gọi Một & B

Nếu bạn .add() đoạn Một trang, và "addToBackStack()" (= lưu ngược lại hành động), bạn sẽ lưu đoạn REMOVE A làm tác vụ khi bạn nhấp vào trở lại.

Nếu bạn .replace() đoạn Một bởi mảnh B, và cũng "addToBackStack()", bạn sẽ đã lưu remove B và thêm Một như hành động khi bạn click vào trở lại.

Vì vậy, bạn thấy lý do tại sao thực tiễn không tốt để thêm phân đoạn phân đoạn đầu tiên của bạn vào hậu trường? Nó sẽ chỉ dẫn đến việc xóa đoạn A bằng cách nhấn lại, dẫn đến một trang trống. Hy vọng điều này là đủ thông tin.

Ngoài ra, khi bạn đã xóa addToBackStack() thành đoạn đầu tiên của mình, bạn không cần ghi đè onBackPressed() vì nó sẽ hoạt động như thế nào. Nó sẽ chỉ hoàn thành các hoạt động khi không có gì còn lại trong backstack mà không hiển thị cho bạn rằng trang trống đầu tiên.

0

bạn đang sử dụng này manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

cố gắng để sử dụng thay vì manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

Hãy cho tôi biết nếu nó hoạt động cho u

+0

Không. Nó đã không giúp tôi –

+0

Bạn có thể thử câu trả lời của tôi @GauravArora không? – Chris

+0

Có, tôi đã thử, sau đó chỉ có tôi trả lời bạn –

2

dòng của bạn:

if(fm.getBackStackEntryCount() > 1){ 

nên là:

if (fm.getBackStackEntryCount() > 0) { 

Bạn đang đặt 3 đoạn trên hậu trường. Sau khi bạn bật hai mục đầu tiên ra, số lượng các mục nhập trên backstack sau đó bằng 1. Vì vậy, bạn ngăn chặn bản thân từ lấy mảnh đầu tiên bạn thêm vào backstack.