IllegalStateException : 조각이 이미 탭 호스트 조각에 추가되었습니다.
FATAL EXCEPTION: main
Process: com.example.loan, PID: 24169
java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form}
at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533)
at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5068)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
at dalvik.system.NativeStart.main(Native Method)
그래서 탭 호스트로 빌드하는 Android 앱이 있습니다. 총 3 개의 탭이 있습니다. tab2에는 tab2에서 조각 트랜잭션을 만드는 버튼이 있습니다 (조각 활동에서 함수를 호출 함).
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.realtabcontent, mFrag);
t.addToBackStack(null);
t.commit();
다음과 같이 실행하면 예외가 있습니다.
- tab2 내부에서 버튼을 눌러 조각을 변경합니다.
- 다른 탭으로 이동 (예 : 탭 1 또는 탭 3)
- 뒤로 버튼 누르기
- 예외 발생
어떻게 고칠까요? 도움을 주셔서 감사합니다
이는 닫히기 전에 동일한 조각 또는 DialogFragment를 두 번 추가하려고 할 때 발생합니다.
그냥 전화 해
if(mFragment.isAdded())
{
return; //or return false/true, based on where you are calling from
}
그렇다고해서 이전 프래그먼트를 제거하고 동일한 프래그먼트를 다시 추가해야하는 이유는 알 수 없습니다. 단순히 프래그먼트 내부의 메서드에 매개 변수를 전달하여 UI / 데이터를 업데이트 할 수 있기 때문입니다.
아래에 언급 된 조각에서 하나의 조건 만 확인하면됩니다.
if(!isAdded())
{
return;
}
i Added = 조각이 현재 활동에 추가 된 경우 true를 반환합니다. 공식 문서에서 가져 왔습니다. 이미 추가 된 경우 해당 조각을 추가하지 않습니다.
참조는 아래 링크를 확인하십시오.
http://developer.android.com/reference/android/app/Fragment.html#i Added ()
여전히 추가 된 경우 이전 조각을 제거한 다음 새 조각을 추가합니다.
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");
프래그먼트 트랜잭션을 시작하기 전에 하나의 조건 만 확인하면됩니다.
if (!fragmentOne.isAdded()){
transaction = manager.beginTransaction();
transaction.add(R.id.group,fragmentOne,"Fragment_One");
transaction.commit();
}
이것은 나를 위해 perfactly 작동합니다 ...
때로는 각 레이아웃에서 적절한 ID를 찾지 못하는 경우가 있습니다. 나는이 문제에 직면했다. 그런 다음 몇 시간 후에 잘못된 recyclerview ID를 설정했음을 발견했습니다. 나는 그것을 바꾸고 잘 작동합니다.
따라서 조각 레이아웃을 다시 확인하십시오.
나를 위해 그것은 다음과 같이 작동합니다.
Fragment oldFragment = manager.findFragmentByTag(READER_VIEW_POPUP);
if (oldFragment != null) {
manager.beginTransaction().remove(oldFragment).commit();
}
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit();
의 경우에도 발생할 수 있습니다 FragmentStatePagerAdapter
당신의 ViewPager
이미 존재하는 항목을 만들 :
override fun getItem(position: Int): Fragment {
return tabs[0] // Right variant: tabs[position]
}
(private val tabs: List<Fragment>
is a list of fragments in tabs).
To my surprise, I made stupid mistake by calling the fragment transaction twice:
if (!FirebaseManager.isClientA && !FirebaseManager.isClientB) {
fragment = new FragmentA();
getFragmentManager().beginTransaction().add(R.id.fragment_frame, fragment, null).addToBackStack("").commit();
} else if (FirebaseManager.isClientB) {
fragment = new FragmentB();
} else {
fragment = new FragmentC();
}
getFragmentManager().beginTransaction().add(R.id.fragment_frame, fragment, null).addToBackStack("").commit();
Make sure you don't make the same mistake.
Add Fragment as below
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.realtabcontent, mFrag);
t.addToBackStack(null);
t.commitNowAllowingStateLoss();
'Programing' 카테고리의 다른 글
빈 문자를 어떻게 표현합니까? (0) | 2020.12.07 |
---|---|
O (n) 알고리즘이 계산 시간 측면에서 O (n ^ 2)를 초과 할 수 있습니까? (0) | 2020.12.07 |
Xcode 프로젝트 설정에서 상대 경로를 어떻게 사용합니까? (0) | 2020.12.07 |
콜백이있는 Python의 any () 함수 (0) | 2020.12.07 |
N 번째 문자 / 숫자마다 문자열 / 숫자 분할? (0) | 2020.12.07 |