Android Fragments 片段未附加到活动,最佳解决方案?

vm0i2vca  于 2022-11-24  发布在  Android
关注(0)|答案(4)|浏览(134)

我有一个带有谷歌Map的Activity和一个片段,其中包含地址(开始/停止)字段。
LocationManager第一次返回用户的位置时,我尝试更新地址片段中的起始字段。
但有时我会遇到例外:java.lang.IllegalStateException: Fragment CoordinatesFragment not attached to Activity
我不明白为什么。我知道有方法Fragment.isAdded(),我可以使用,但它似乎不是解决问题的最佳方法。
此外,有时我会在尝试恢复状态时遇到此异常(在onRestoreInstanceState(Bundle state)中,我获取数据,而在onMapLoaded()中,尝试使用)

qfe3c7zg

qfe3c7zg1#

如果可以使用RxJava2,就可以在Observable中缓存LocationManager的结果,而Fragment可以订阅该结果。
如果结果已经到达,而片段还没有被附加,那么片段将在它被附加时收到结果,否则它将立即收到结果。
我建议您学习如何使用RxJava来解决此类问题。

f4t66c6m

f4t66c6m2#

请检查此内容;

if(!isAdded()) {
    return;
}
f3temu5u

f3temu5u3#

private void setFragment(Fragment fragmentToSet, String tag) {

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    Fragment fragment = manager.findFragmentByTag(tag);
    if (savedInstanceState == null) {
        if (fragment != null && !fragment.isAdded()) {
            transaction.replace(R.id.home_container, fragment, tag);
        } else if (fragmentToSet != null && !fragmentToSet.isAdded()) {
            transaction.replace(R.id.home_container, fragmentToSet, tag);
        }
    }else{
        transaction.replace(R.id.home_container, fragment, tag);
    }
    transaction.commitAllowingStateLoss();
    manager.executePendingTransactions();
}

尝试使用此函数设置Activity中的片段。它对我来说很好用。您可以保存Activity的onCreate中的savedInstanceState

dbf7pr2w

dbf7pr2w4#

虽然使用isAdded()是最简单的解决方案,但我遇到了使用这种方法不是最佳选择的情况。
首先,我创建了一个FragmentActivity类型的全局变量。
然后,在onViewCreated()方法中,我将其值初始化为:
fragmentActivity = requiredActivity();
之后,在onAttach()方法中,我将参数中的上下文强制转换为FragmentActivity,并以以下方式将其赋值给该全局变量:

@Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        this.fragmentActivity = (FragmentActivity) context;
    }

通过这种方式,我可以使用fragmentActivity来避免IllegalStateException,而不是使用requireActivity()requireContext()

相关问题