2012-12-06 36 views
11

Vì tôi đã nâng cấp Ứng dụng của mình để sử dụng số điện thoại hỗ trợ lib rev. 11 và biên dịch chống lại SDK 4.2 tôi nhận được lỗi sauĐã thêm phân đoạn. Hỗ trợ lib

java.lang.IllegalStateException: Fragment already added: i{4079e598 #2 id=0x1020002 i} 
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1159) 
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:729) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1493) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:477) 
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:174) 

Tôi đã đọc về các vấn đề tương tự như trên stackoverflow. Một số người trong số họ đề nghị để tránh phương pháp thay thế, mà tôi không sử dụng. Giao dịch gây ra vụ tai nạn trên rollback trông như thế này:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit() 

ý kiến ​​khác nói điều này có thể xảy ra nếu bạn đang sử dụng chuyển đoạn mà không thể hoàn thành đủ nhanh chóng trước khi người dùng nhấn lại một lần nữa. Vì tôi sử dụng hoạt ảnh chuyển tiếp trên các đoạn đã cho, điều này có thể là nguyên nhân. Tuy nhiên, việc xóa chuyển đổi không phải là lựa chọn và vì điều này độc quyền xảy ra trên điện thoại chạy 2.3.x và lỗi đã được giới thiệu bằng cách nâng cấp lên lib 11 và sdk 4.2 Tôi hy vọng Google sẽ khắc phục sự cố với bản phát hành tiếp theo.

Có bất kỳ vấn đề tương tự nào, thông tin về việc liệu việc này có được sửa trong mục 4.2.1 hoặc hỗ trợ r12 hay gợi ý những gì tôi có thể làm để tránh lỗi không?

+0

Làm điều tương tự, nhưng với 'DialogFragment'. –

+0

Tôi cũng nhận được nó với DialogFragment đôi khi ... Tôi đã gửi một báo cáo [ở đây] (http://code.google.com/p/android/issues/detail?id=41552&thanks=41552&ts=1355757013). Nhưng chưa có câu trả lời. – phlebas

+0

gặp lỗi tương tự đối với thư viện hỗ trợ r12. Đăng dấu vết để theo dõi vấn đề android quá. – Sash0k

Trả lời

6

Tôi cố gắng để khắc phục vấn đề bằng cách sử dụng một gợi ý tôi thấy here

Vì vậy, tôi đã thêm executePendingTransactions() ngay lập tức thực hiện giao dịch:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit() 
getFragmentManager().executePendingTransactions(); 

này phải đảm bảo rằng các backstack luôn trong tình trạng sạch sẽ Tôi hy vọng và không có bất kỳ nhược điểm tiêu cực nào mà tôi có thể nghĩ đến.

Cập nhật Mặc dù nó không làm việc trên điện thoại thông thường, vấn đề này vẫn còn trên một số thiết bị chung chung mà không có một số Android phiên bản nổi tiếng, như 4.0.1 hoặc tương tự, nhưng thay vì báo cáo một số ngày như 'Thu ngày 02 tháng 3 2006 00:00:00 GMT + 0100 (MEZ) 'là Số phiên bản Android, ví dụ: samsung - espressowifixx - GT-P3110 báo cáo ngày tháng đã cho là phiên bản Android và mang lại ngoại lệ thêm vào phân đoạn ... Vẫn gây phiền nhiễu. Người dùng không quan tâm đến công cụ này, do đó, nó luôn luôn là nhà phát triển đã bị phỉ báng bị đổ lỗi. Không có vấn đề gì đối với các công ty tỷ đô la, nhưng các nhà phát triển đơn lẻ, chỉ cần làm điều gì đó hữu ích hơn thời gian của bạn hơn là viết ứng dụng;)

+0

Tôi nhận được chính xác tai nạn tương tự và tôi không sử dụng dòng ở trên cả. Tôi chỉ cần thêm ft.add (newFrag) .addToBackStack (null) .commit() như thế này. – tasomaniac

+0

@phlebas Bạn có thể đề xuất tôi nên chỉnh sửa lớp FragmentManager.java trong thư viện SUpport – Adi

+0

Vui lòng đề cập đến mã của bạn. –

5

Vì vậy, đối với tôi, hóa ra tôi thực sự đang cố thêm một đoạn hai lần. Có lẽ trong các phiên bản thư viện hỗ trợ trước đó nó chỉ nuốt cái này và tiếp tục. Thật không may, thậm chí kiểm tra nếu đoạn isAdded() không làm việc cho tôi, bởi vì trong trường hợp của tôi, tôi đã gọi chúng trở lại trước khi giao dịch có thời gian để thực sự thêm đoạn đầu tiên.

Điều tôi đã kết thúc là tạo một biến lớp boolean fragmentAdded và đặt nó thành true ngay sau khi tôi thực hiện giao dịch. Sau đó, tôi kiểm tra boolean này trước khi cố gắng thêm đoạn. Có thể không phải là một giải pháp cho vấn đề của bạn, nhưng đối với tôi nó đã được, vì vậy hy vọng nó sẽ giúp.

+5

thực sự buồn mà chúng ta cần phải làm điều này. là có thực sự không có phương pháp để nói dứt khoát nếu một mảnh đã được thêm vào? –

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