为什么我在 Android 中得到 "Cannot remove Fragment attached to a different FragmentManager"?
Why I am getting "Cannot remove Fragment attached to a different FragmentManager" in Android?
我正在尝试删除一个片段,但很少在 Crashlytics 上看到错误 java.lang.IllegalStateException:无法删除附加到不同 FragmentManager 的片段。
我有一个单独的片段用于获取用户的当前位置。我使用下面的代码打开片段。
private void openLocationFragment() {
LocationFragment locationFragment = LocationFragment.newInstance();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, locationFragment, "location_fragment")
.commitAllowingStateLoss();
}
现在在片段中,一旦我获得位置更新,我就会使用附加到 activity 的侦听器调用方法 onLocationFetched。
在此方法中,我使用以下代码删除了片段。
@Override
public void onLocationFetched(Location location) {
FragmentManager fragmentManager = getSupportFragmentManager();
LocationFragment locationFragment = (LocationFragment) fragmentManager.findFragmentByTag("location_fragment");
if (locationFragment != null) {
fragmentManager.beginTransaction()
.remove(locationFragment) // Here is the exception
.commitAllowingStateLoss();
}
if(location == null){
fetchUserDetails();
}else
fetchCity(location);
}
堆栈跟踪:
Fatal Exception: **java.lang.IllegalStateException: Cannot remove Fragment attached to a different FragmentManager.**
Fragment LocationFragment{32a2ed0 (d41fc341-baf2-4266-948a-866fba7e57b5) id=0x7f09028b location_fragment} is already attached to a FragmentManager.
at androidx.fragment.app.BackStackRecord.remove(BackStackRecord.java:316)
at com.avail.easyloans.feature.marketplace.activities.ActivityMarketplace.onFragmentFetched(ActivityMarketplace.java:909)
at com.avail.easyloans.base.fragments.LocationFragment.sendLocationToClient(LocationFragment.java:192)
at com.avail.easyloans.base.fragments.LocationFragment.access[=14=]0(LocationFragment.java:46)
at com.avail.easyloans.base.fragments.LocationFragment.onSuccess(LocationFragment.java:220)
at com.avail.easyloans.base.fragments.LocationFragment.onSuccess(LocationFragment.java:214)
at com.google.android.gms.tasks.zzn.run(zzn.java:4)
at android.os.Handler.handleCallback(Handler.java:836)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6339)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
我这是怎么了?
我希望每个 Activity
负责维护自己的 Fragment
。这意味着如果您尝试访问的片段与另一个 Activity
的 FragmentManager
关联,那么您的应用程序将失败。
我可以想出几种解决方法,具体取决于您想要的行为。如果您不介意在两个单独的活动中让两个 LocationFragment
拥有各自独立的生命周期,您可以在 FragmentManager
上使用 findFragmentById()
访问它们。即:
private void openLocationFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
final Fragment current = fragmentManager.findFragmentById(R.id.fragmentContainer);
if(current == null || !(current instanceof LocationFragment)) {
fragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, LocationFragment.newInstance())
.commitAllowingStateLoss();
}
}
在你的另一个 Activity 上做同样的事情。或者,您可以调用在 onLocationFetched()
中托管 LocationFragment
的其他 Activity
我正在尝试删除一个片段,但很少在 Crashlytics 上看到错误 java.lang.IllegalStateException:无法删除附加到不同 FragmentManager 的片段。
我有一个单独的片段用于获取用户的当前位置。我使用下面的代码打开片段。
private void openLocationFragment() {
LocationFragment locationFragment = LocationFragment.newInstance();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, locationFragment, "location_fragment")
.commitAllowingStateLoss();
}
现在在片段中,一旦我获得位置更新,我就会使用附加到 activity 的侦听器调用方法 onLocationFetched。
在此方法中,我使用以下代码删除了片段。
@Override
public void onLocationFetched(Location location) {
FragmentManager fragmentManager = getSupportFragmentManager();
LocationFragment locationFragment = (LocationFragment) fragmentManager.findFragmentByTag("location_fragment");
if (locationFragment != null) {
fragmentManager.beginTransaction()
.remove(locationFragment) // Here is the exception
.commitAllowingStateLoss();
}
if(location == null){
fetchUserDetails();
}else
fetchCity(location);
}
堆栈跟踪:
Fatal Exception: **java.lang.IllegalStateException: Cannot remove Fragment attached to a different FragmentManager.**
Fragment LocationFragment{32a2ed0 (d41fc341-baf2-4266-948a-866fba7e57b5) id=0x7f09028b location_fragment} is already attached to a FragmentManager.
at androidx.fragment.app.BackStackRecord.remove(BackStackRecord.java:316)
at com.avail.easyloans.feature.marketplace.activities.ActivityMarketplace.onFragmentFetched(ActivityMarketplace.java:909)
at com.avail.easyloans.base.fragments.LocationFragment.sendLocationToClient(LocationFragment.java:192)
at com.avail.easyloans.base.fragments.LocationFragment.access[=14=]0(LocationFragment.java:46)
at com.avail.easyloans.base.fragments.LocationFragment.onSuccess(LocationFragment.java:220)
at com.avail.easyloans.base.fragments.LocationFragment.onSuccess(LocationFragment.java:214)
at com.google.android.gms.tasks.zzn.run(zzn.java:4)
at android.os.Handler.handleCallback(Handler.java:836)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6339)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
我这是怎么了?
我希望每个 Activity
负责维护自己的 Fragment
。这意味着如果您尝试访问的片段与另一个 Activity
的 FragmentManager
关联,那么您的应用程序将失败。
我可以想出几种解决方法,具体取决于您想要的行为。如果您不介意在两个单独的活动中让两个 LocationFragment
拥有各自独立的生命周期,您可以在 FragmentManager
上使用 findFragmentById()
访问它们。即:
private void openLocationFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
final Fragment current = fragmentManager.findFragmentById(R.id.fragmentContainer);
if(current == null || !(current instanceof LocationFragment)) {
fragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, LocationFragment.newInstance())
.commitAllowingStateLoss();
}
}
在你的另一个 Activity 上做同样的事情。或者,您可以调用在 onLocationFetched()
LocationFragment
的其他 Activity