30
09-19 12:23:01.084: E/AndroidRuntime(24169): FATAL EXCEPTION: main 
09-19 12:23:01.084: E/AndroidRuntime(24169): Process: com.example.loan, PID: 24169 
09-19 12:23:01.084: E/AndroidRuntime(24169): java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form} 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Handler.handleCallback(Handler.java:733) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Handler.dispatchMessage(Handler.java:95) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Looper.loop(Looper.java:136) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.app.ActivityThread.main(ActivityThread.java:5068) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at java.lang.reflect.Method.invokeNative(Native Method) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at java.lang.reflect.Method.invoke(Method.java:515) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at dalvik.system.NativeStart.main(Native Method) 

Vì vậy, tôi có một ứng dụng Android được xây dựng với tabhost. Có ba tab trong tổng số, trong tab2, có một nút để thực hiện giao dịch đoạn trong tab2 (được gọi hàm trong hoạt động fragment)IllegalStateException: Phân đoạn đã được thêm vào trong đoạn tabhost

FragmentTransaction t = getSupportFragmentManager().beginTransaction(); 
     t.replace(R.id.realtabcontent, mFrag); 
     t.addToBackStack(null); 
     t.commit(); 

Có ngoại lệ nếu tôi chạy như thế này:

  1. Bên trong tab2, tôi nhấn nút để thay đổi đoạn
  2. đến tab khác (ví dụ. tab 1 hoặc tab 3)
  3. bấm lại nút
  4. Ném ngoại lệ

Cách khắc phục điều đó? Cảm ơn vì đã giúp

+0

bản sao có thể có của [IllegalStateException: Phân đoạn đã được thêm sẽ xuất hiện nếu ứng dụng rất dài trong nền] (http://stackoverflow.com/questions/24629080/illeg alstateexception-fragment-already-added-xuất hiện-nếu-một-app-đã-rất-dài) – FWeigl

+0

có nghĩa là backpress là thêm một mảnh mới, logic là gì trong backstack? Cảm ơn rất nhiều – user782104

+0

là mFrag được thêm vào một số tab khác ngoài tab2? – Akhil

Trả lời

66

Điều này xảy ra khi chúng ta cố gắng thêm cùng một mảnh hoặc DialogFragment hai lần trước khi miễn nhiệm,

chỉ cần gọi

if(mFragment.isAdded()) 
{ 
    return; //or return false/true, based on where you are calling from 
} 
+3

Đây phải là câu trả lời được chấp nhận. Câu trả lời được chấp nhận không có ý nghĩa. Đầu tiên, không nên có sự phủ định của 'isAdded()'. Thứ hai, trong các ý kiến, nó được đề xuất rằng mã này đi vào 'onCreate()', cũng vô nghĩa. Dòng mã này nên được đặt trực tiếp trước dòng mà đoạn được thêm vào (hoặc thay thế), không phải trong 'onCreate()' hoặc 'onCreateView()'. Đã quá muộn để thực thi mã đó theo một trong hai phương pháp đó. – Alex

+0

'if (fragment.isAdded()) fragmentTransaction.show (phân đoạn);' –

4

Bạn chỉ cần phải kiểm tra một điều kiện trong đoạn của bạn đề cập dưới đây:

if(!isAdded()) 
{ 
    return; 
} 

isAdded = Return true nếu đoạn hiện đang được bổ sung vào hoạt động của nó. Lấy từ tài liệu chính thức. này sẽ không thêm rằng mảnh nếu nó đã được thêm

Kiểm tra bên dưới liên kết cho một tài liệu tham khảo:
http://developer.android.com/reference/android/app/Fragment.html#isAdded()

+0

cảm ơn sự giúp đỡ của bạn, bạn có nghĩa là tôi đặt if (! IsAdded()) bên trong oncreateview? – user782104

+0

Có, bạn chỉ cần đặt mã mà tôi đã đề cập trong câu trả lời của tôi ở trên ... Nó có nghĩa là đoạn của bạn đã được thêm vào trong ngăn xếp. Vì vậy, không cần phải thêm nó một lần nữa và nó trở lại đơn giản. –

+4

điều này không có ý nghĩa, bạn không thể trả về void trong onCreateView, ý của bạn là onCreate? tôi đã thử điều này trong đó và nó đã không giúp vấn đề của tôi – Fonix

1

Đôi khi điều này xảy ra vì không tìm thấy id phù hợp từ bố cục tương ứng. Tôi phải đối mặt với vấn đề này. Sau đó, sau nhiều giờ tôi thấy rằng tôi đặt sai recyclerview id. Tôi thay đổi nó, và làm việc tốt cho tôi.

Vì vậy, hãy kiểm tra lại bố cục đoạn của bạn.

+0

Cảm ơn, nó cũng giống như vậy đối với tôi. Thông báo ngoại lệ không thể gây hiểu lầm nhiều hơn. – SqueezyMo

2

Bạn chỉ cần phải kiểm tra một điều kiện trước khi giao dịch bắt đầu đoạn

if (!fragmentOne.isAdded()){ 
      transaction = manager.beginTransaction(); 
      transaction.add(R.id.group,fragmentOne,"Fragment_One"); 
      transaction.commit(); 
} 

này đang làm việc perfactly cho tôi ...

0

Tháo mảnh cũ trong trường hợp nó vẫn được bổ sung và sau đó thêm mới fragment:

FragmentManager fm = getSupportFragmentManager(); 
Fragment oldFragment = fm.findFragmentByTag("fragment_tag"); 
if (oldFragment != null) { 
    fm.beginTransaction().remove(oldFragment).commit(); 
} 
MyFragment newFragment = new MyFragment(); 
fm.beginTransaction().add(newFragment , "fragment_tag"); 
Các vấn đề liên quan