首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我得到的片段没有附加到上下文。需要使用什么上下文?

我得到的片段没有附加到上下文。需要使用什么上下文?
EN

Stack Overflow用户
提问于 2019-10-31 21:01:59
回答 5查看 12.3K关注 0票数 8

我从Firebase Crashlytics得到异常

代码语言:javascript
运行
复制
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)

片段中的错误行

代码语言:javascript
运行
复制
imageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.blue));

也尝试过

代码语言:javascript
运行
复制
imageView.setColorFilter(getResources().getColor(R.color.blue));

我在Activity和FragmentStatePagerAdapter中使用viewPager。我需要在fragment to setColorFilter中使用什么上下文?Thx

EN

回答 5

Stack Overflow用户

发布于 2019-10-31 21:08:28

将以下内容添加到您的片段中:

代码语言:javascript
运行
复制
private Context mContext;    

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

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

在你的图像视图中

代码语言:javascript
运行
复制
imageView.setColorFilter(ContextCompat.getColor(mContext, R.color.blue));
票数 9
EN

Stack Overflow用户

发布于 2019-10-31 21:53:58

尝试使用应用程序上下文获取应用程序资源以防止IllegalStateException (未附加到上下文)

代码语言:javascript
运行
复制
// 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变量,例如:

代码语言:javascript
运行
复制
imageView.setColorFilter(ContextCompat.getColor(appContext, R.color.blue));
票数 2
EN

Stack Overflow用户

发布于 2020-08-04 21:27:54

之所以会出现这种崩溃,是因为您试图从已从父活动分离的片段中调用getContext()。

从堆栈跟踪看,似乎有一个处理程序对MyFragment.java行156的调用,这使我认为它是一些后台工作正在发生,但它在片段被分离时完成。

解决这个问题的一个快速方法是,在尝试执行修改视图的任何代码行之前,检查片段是否附加到activity。

代码语言:javascript
运行
复制
if (isAttachedToActivity()){
  imageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.blue));
}

代码语言:javascript
运行
复制
if (isAttachedToActivity()){
  imageView.setColorFilter(getResources().getColor(R.color.blue));
}

isAttachedToActivity()如下所示:

代码语言:javascript
运行
复制
public boolean isAttachedToActivity() {
    boolean attached = isVisible() && getActivity() != null;
    return attached;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58643962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档