2013-08-19 19 views
6

Tôi muốn để có thể đảo ngược một replaceFragmentTransaction bằng cách sử dụng addToBackStack():Nhấp lại nút sau khi giao dịch Fragment sử dụng addToBackStack không có gì

FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();   
Fragment scheduleFragment = new ScheduleFragment();  
fragmentTransaction.replace(R.id.content_container, scheduleFragment, "scheduleFragment"); 
fragmentTransaction.addToBackStack("scheduleFragment"); 
fragmentTransaction.commit(); 

nhưng sau đó, nhấp vào nút quay lại không có gì.

Từ tài liệu và nó được cho là để đảo ngược giao dịch.

Tôi đang thiếu gì?

+2

[doc] (http://developer.android.com/training/implementing-navigation/temporal.html) (xem "Thực hiện điều hướng quay lại cho phân đoạn") nói để sử dụng '.add' thay vì' .replace '. Kiểm tra câu trả lời ở đây: http://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtobackstack nhưng tôi đoán '.replace' không được hỗ trợ đầy đủ trong khi' .add' dường như hoạt động đúng. – electrocrat

+0

Câu trả lời của @Abel Paz dưới đây là bản sửa lỗi đúng cho vấn đề với '.replace' – electrocrat

Trả lời

4

Hãy thử fragmentTransaction.addToBackStack(null) Các tham số cho addToBackStack() là một cái tên tùy chọn cho tình trạng trở lại, bạn không sử dụng thẻ trong replace() phương pháp mà chỉ là một thẻ tùy chọn cho đoạn. Bạn có thể đọc thêm về điều này here.

+0

Tôi cần thẻ. – jul

+0

Có, bạn có thể giữ thẻ để tham khảo đoạn, nhưng không sử dụng 'addToBackStack (null)' làm việc? Điều gì xảy ra nếu bạn sử dụng? –

+0

Tôi đã không thử vì nó không có ý nghĩa với tôi. Vì vậy, tôi đã thực hiện ngăn xếp 'Fragment' của riêng mình (xem câu trả lời của tôi). – jul

0

Tôi thực hiện riêng Fragment chồng tôi:

public Fragment addFragmentToStack(Fragment fragment){ 
    if(MyApplication.fragmentStack.size()>20){ 
     MyApplication.fragmentStack.remove(0); 
    } 
    return MyApplication.fragmentStack.push(fragment); 
} 

public void onBackPressed() { 
     if (MyApplication.fragmentStack.size() > 0) { 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.replace(R.id.content_container, MyApplication.fragmentStack.pop()); 
      ft.commit(); 
     } 
     else{ 
      finish(); 
     } 
} 
24

Cách đúng để làm điều này là sử dụng phương pháp onBackPressed() để bắt mà lại sự kiện trong ứng dụng của bạn, và sau đó "bật" các backStack với popBackStack(). Ví dụ:

public void onBackPressed() 
{ 
    // Catch back action and pops from backstack 
    // (if you called previously to addToBackStack() in your transaction) 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0){ 
     getSupportFragmentManager().popBackStack(); 
    } 
    // Default action on back pressed 
    else super.onBackPressed(); 
} 

PD: Xin lỗi vì đã trả lời chậm, nhưng tôi vừa thấy câu hỏi của bạn. Hy vọng nó giúp!

+0

Sau đó, tại sao địa ngục, trong tài liệu Android, họ truyền đạt một cách sai lầm. :( –

+2

Tôi không nghĩ rằng logic này là cần thiết.Ứng dụng sẽ hoạt động chính xác như nhau nếu bạn sử dụng 'addToBackStack'. –

+0

Trái ngược với cách tất cả các doco dường như chỉ đến việc sử dụng các cấu trúc này, tôi cũng chỉ có thể có được điều này làm việc như dự định w/việc bổ sung mã này trong 'OnBackPressed':/ – bc3tech

2

Tôi đã lâu nhưng tôi hy vọng điều này sẽ giúp một người nào đó.

fragmentTransaction.addToBackStack(null) sẽ không hoạt động nếu bạn đang mở rộng AppCompatActivity. Nó hoạt động tốt trong Activity. Tôi không thể tìm ra lý do.