java.lang.IllegalStateException:片段未附加到上下文

pro*_*bie 5 java android android-fragments android-viewpager

我的 MainActivity 中有一个带有 viewpager 的 tablayout。

我的PagerAdapter看起来像这样:

public class MainActivityPagerAdapter extends PagerAdapter {

    public MainActivityPagerAdapter(FragmentManager fm, int numOfTabs) {
        super(fm, numOfTabs);
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                return new StoresFragment();
            case 1:
                return new OrdersFragment();
            default:
                return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我从另一个这样的活动回来:

Intent intent = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish(); //finishAffinity();
Run Code Online (Sandbox Code Playgroud)

但是后来我java.lang.IllegalStateException在 MainActivity 的 viewpager 中得到了一个片段。

我阅读了许多相关问题并试图解决这个问题。据说,当人们在 PagerAdapter 之外保留对 Fragments 的引用时,就会发生这种情况。但是我没有这样做,正如您在我的代码中看到的那样。

有谁知道我做错了什么?

编辑 - 堆栈跟踪

FATAL EXCEPTION: main
    Process: com.lifo.skipandgo, PID: 23665
    java.lang.IllegalStateException: Fragment OrdersFragment{42c2a740} not attached to a context.
    at android.support.v4.app.Fragment.requireContext(Fragment.java:614)
    at android.support.v4.app.Fragment.getResources(Fragment.java:678)
    at com.lifo.skipandgo.activities.fragments.OrdersFragment$1.results(OrdersFragment.java:111)
    at com.lifo.skipandgo.connectors.firestore.QueryResult.receivedResult(QueryResult.java:37)
    at com.lifo.skipandgo.controllers.UserController$2.onUpdate(UserController.java:88)
    at com.lifo.skipandgo.connectors.firestore.QuerySubscription.onEvent(QuerySubscription.java:59)
    at com.lifo.skipandgo.connectors.firestore.QuerySubscription.onEvent(QuerySubscription.java:18)
    at com.google.firebase.firestore.zzg.onEvent(Unknown Source)
    at com.google.firebase.firestore.g.zzh.zza(SourceFile:28)
    at com.google.firebase.firestore.g.zzi.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:146)
    at android.app.ActivityThread.main(ActivityThread.java:5653)
    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:1291)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

编辑: 有趣的是,当发生错误时,该视图已明确加载。因为在再次显示片段后大约10-15秒后会出现错误。我在我的 orderFragment 中出现了这个错误:

orders = new QueryResult<UserOrder>(UserOrder.class) {
            @Override
            public void results(List<UserOrder> results) { 
orderLoadingMessage.setBackgroundColor(getResources().getColor(R.color.green)); 
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样做了onCreateView,这个结果在视图加载后大约 10-15 秒出现。

Mad*_*ddy 9

在更新您的 Activity UI 之前使用它:

if(isAdded())// This {@link androidx.fragment.app.Fragment} class method is responsible to check if the your view is attached to the Activity or not
{
        // TODO Update your UI here
}
Run Code Online (Sandbox Code Playgroud)


fer*_*ini 7

问题似乎是,您的片段正在侦听某些事件(通过 UserController 和 QueryResult),并且在将片段附加到上下文之前会触发这些事件。

尝试在片段分离时取消注册,并在附加后再次取消注册(LiveData 也可以帮助解决此问题)。另一种方法可能是在分离时接收和存储事件,并且仅在附加后处理它。