2013-02-11 46 views
13

Đây là chức năng chịu trách nhiệm cho việc thêm các mảnh vỡ để sao stack:Android - addToBackStack() không hoạt động?

public void populateContent(File f) 
{ 

    ContentFragment cf = new ContentFragment(ctx, ac, this); 
    FragmentTransaction transaction = ac.getSupportFragmentManager().beginTransaction();; 
    cf.updateView(f); 

    transaction.replace(R.id.contentFragment, cf); 

    transaction.addToBackStack(null); 

    transaction.commit(); 

} 

Khi tôi nhấp vào nút quay lại, đoạn cuối cùng không được nạp (không có gì xảy ra).

Bất kỳ ý tưởng nào có thể gây ra điều này?

Chỉnh sửa: FragmentQuản lý nhật ký.

http://pastebin.com/mYnVdkLG

Dường như với tôi như thể ứng dụng của tôi được lưu quan điểm thứ hai hai lần, thay vì tiết kiệm là người đầu tiên và sau đó là quan điểm thứ hai.

+0

tôi nghĩ rằng bạn nên addtobackStack() đầu tiên và sau đó thay thế các đoạn ... – user1969053

+0

Điều này không giải quyết được. – Tool

+0

Nhìn câu trả lời này: http://stackoverflow.com/a/14030872/1484779 – jlopez

Trả lời

11

Tôi không chắc chắn về giải pháp thực tế nhưng tôi có thể hướng dẫn bạn một chút và có lẽ bạn có thể tìm ra vấn đề là gì.

Bạn có thực sự thay thế hai đoạn không? Nếu bạn không thì không có giao dịch nào để hoàn nguyên. Ngoài ra, bạn còn thêm Fragment đầu tiên từ XML? Người quản lý sẽ không biết về đoạn này và bạn có thể cần phải thêm Fragment đầu tiên bằng cách sử dụng giao dịch.

Hãy cẩn thận để kiểm tra if (savedInstanceState == null) performFirstTransaction() nếu không bạn sẽ kết thúc việc thêm Fragment đầu tiên hai lần.

Một ý tưởng hay là sử dụng enableDebugLogging trong FragmentManager. Điều này sẽ cho bạn biết về những mảnh mà người quản lý biết.

Xem này: http://developer.android.com/reference/android/app/FragmentManager.html#enableDebugLogging(boolean)

Là một mặt lưu ý, đó là không nên sử dụng một constructor tùy chỉnh cho Fragment của bạn. Đó là bởi vì nếu ứng dụng của bạn bị giết và được khởi tạo lại bởi hệ điều hành, nó sẽ gọi hàm tạo rỗng.

Bạn nên sử dụng phương pháp tĩnh như ContentFragment.getInstance(<params>) để tạo Fragment.

Xem thêm thông tin tại: http://developer.android.com/reference/android/app/Fragment.html tại phần "Tổng quan về lớp".

Tôi hy vọng câu trả lời của tôi sẽ giúp bạn một chút để tìm ra vấn đề.

+0

Tôi có thể hiển thị cho bạn các bản ghi FragmentManager, có thể họ sẽ giúp đỡ. – Tool

+0

Ngoài ra, tôi không có một hàm tạo tùy chỉnh cho Phân đoạn của tôi - tôi đã không thay đổi nó. Tôi mặc dù có một phương pháp trong Fragment phục vụ như là một cập nhật xem. – Tool

+0

OK, tôi đã đăng liên kết nhật ký từ Trình quản lý. – Tool

51

Dường như việc gọi addToBackStack() trên giao dịch phân đoạn là không đủ, chúng tôi phải xử lý việc bật lên ngăn xếp sau khi nút Quay lại được nhấn bởi chính chúng ta. Tôi thêm này để hoạt động của tôi và nó làm việc như mong đợi:

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0){ 
     getFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 
+3

Tác phẩm này hoạt động nhưng không phát lại hoạt ảnh. EDIT: Nếu bạn muốn chơi các hình ảnh động trên popbackstack, thêm hai tham số thêm khi bạn gọi setCustomAnimation. Xem [tại đây] (http://stackoverflow.com/questions/25485822/android-pop-fragment-from-backstack-with-animation). – Nathan

+2

Điều này hoạt động độc đáo. Thật đáng ngạc nhiên là chúng tôi phải tự mình xử lý vì tôi đoán tài liệu nói rằng điều này sẽ diễn ra tự động. – Ankit

+0

nếu điều này được ghi lại một cách ngẫu nhiên? – Defuera

2

tôi đã nói thêm, không thay thế, nhưng tôi đã phải gọi addToBackStack (null) trước khi add(), chứ không phải sau đó, trên đoạn này sẽ đóng, không phải trên mảnh vỡ sẽ vẫn mở.

Trong lớp A (mở đầu)

FragmentTransaction ft = fm.beginTransaction(); 
ft.add(R.id.layout_a, f, Constants.FRAGMENT_KEY); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.commit(); 

Trong lớp B (mở bằng hạng A)

FragmentTransaction ft = fm.beginTransaction(); 
ft.addToBackStack(null); 
ft.add(R.id.layout_b, f, Constants.FRAGMENT_KEY); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.commit(); 
+0

addToBackStack khi thực hiện thêm/thay thế đoạn là nó đã làm gì cho tôi. – Clocker

+0

* "gọi addToBackStack (null) trước khi thêm(), không phải sau" * Đây chính xác là vấn đề của tôi. Bạn đã cứu tôi rất nhiều đau đầu. Cảm ơn! –

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