Я получаю фрагмент, не привязанный к контексту. Какой контекст нужно использовать? - PullRequest
1 голос
/ 31 октября 2019

Я получаю исключение от Firebase Crashlytics

Fatal Exception: java.lang.IllegalStateException: Fragment MyFragment{122418b (05b123e6-aa8d-4de4-8f7e-49c95018234b)} not attached to a context.
       at androidx.fragment.app.Fragment.requireContext(Fragment.java:774)
       at androidx.fragment.app.Fragment.getResources(Fragment.java:838)
       at com.timskiy.pregnancy.fragments.MyFragment$1$1.run(MyFragment.java:156)
       at android.os.Handler.handleCallback(Handler.java:907)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:216)
       at android.app.ActivityThread.main(ActivityThread.java:7625)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)

Строка ошибки из фрагмента

imageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.blue));

также пробовал

imageView.setColorFilter(getResources().getColor(R.color.blue));

Я использую viewPager в Activity и FragmentStatePagerAdapter,Какой контекст мне нужно использовать во фрагменте для setColorFilter? Thx

Ответы [ 3 ]

4 голосов
/ 31 октября 2019

Добавьте это в вашем фрагменте:

private Context mContext;    

@Override
public void onAttach(Context context) {
    super.onAttach(activity);
    mContext = context;
}

@Override
public void onDetach() {
    super.onDetach();
    mContext = null;
}

И в вашем представлении изображения

imageView.setColorFilter(ContextCompat.getColor(mContext, R.color.blue));
0 голосов
/ 31 октября 2019

Попробуйте использовать контекст приложения для извлечения ресурсов приложения для предотвращения исключения IllegalStateException (не привязанного к контексту)

// Init global variable with the application context first:
@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    if (appContext == null)
        appContext = context.getApplicationContext();
}

Затем используйте appContext var везде, где вы хотите получить ресурсы приложения, например:

imageView.setColorFilter(ContextCompat.getColor(appContext, R.color.blue));
0 голосов
/ 31 октября 2019

В вашем фрагменте безопасно использовать requireContext() / requireActivity() внутри onViewCreated вместо getContext() / getActivity().

imageView.setColorFilter(ContextCompat.getColor(requireContext(), R.color.blue));
...