【问题标题】:getContext() returns null in Fragment. View seems to be unattachedgetContext() 在 Fragment 中返回 null。视图似乎未附加
【发布时间】:2020-06-16 13:47:50
【问题描述】:

Glide.with((getContext())).load(user.getImgURl()).into(image_profile);

以上行将 getContext 作为 null 返回,因此允许应用程序崩溃。 我在 onDataChange 方法下的一个片段中添加了这个,如下所示。

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view=inflater.inflate(R.layout.fragment_profile, container, false);

    image_profile=view.findViewById(R.id.profile_image);
    username=view.findViewById(R.id.username);


    storageReference=FirebaseStorage.getInstance().getReference("uploads");

    fuser=FirebaseAuth.getInstance().getCurrentUser();
    reference=FirebaseDatabase.getInstance().getReference("Users").child(fuser.getUid());




    reference.addValueEventListener(new ValueEventListener() {


        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


            User user= dataSnapshot.getValue(User.class);
            username.setText(user.getUsername());

            if(user.getImgURl()!= null && user.getImgURl().equals("default")){
                image_profile.setImageResource(R.mipmap.ic_launcher);
            }else{

            Glide.with((getContext())).load(user.getImgURl()).into(image_profile);

            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });



    image_profile.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            openImage();
        }
    });


    return view;
}

该代码应该从 firebase 存储中检索图像并将其显示到 image_profile。

以下是错误的logcat:

java.lang.NullPointerException: 

您不能在 getActivity() 返回 null 的尚未附加的 View 或 Fragment 上开始加载(这通常发生在附加 Fragment 之前或销毁 Fragment 之后调用 getActivity() 时)。

        at com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:31)
        at com.bumptech.glide.Glide.getRetriever(Glide.java:675)
        at com.bumptech.glide.Glide.with(Glide.java:707)
        at com.hello.khushboo.messaging.Fragments.ProfileFragment$1.onDataChange(ProfileFragment.java:110)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.5:75)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.0.5:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.0.5:55)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

感谢任何帮助。 提前谢谢你。

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

    在片段中使用 getActivity() 作为这样的上下文: 下面的代码:

     Glide.with(getActivity())
                .load(imageUri)
                .into(imageview);
    

    【讨论】:

      【解决方案2】:

      上网查了很多资料,终于成功了。

              @Override
              public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                  User user = dataSnapshot.getValue(User.class);
                  username.setText(user.getUsername());
                  if (user.getImageURL().equals("default")){
                      image_profile.setImageResource(R.mipmap.ic_launcher);
                  } else {
                      if(getContext()!=null)
                     Glide.with(getActivity()).load(user.getImageURL()).into(image_profile);
                  }
              }
      

      要了解更多关于片段生命周期的信息,请浏览这个link

      【讨论】:

      • 行``` if(getContext()!=null)```为我修复了它。不错的解决方案
      【解决方案3】:
      If(isAdded()) {
         Glide.with((getActivity().getContext())).load(user.getImgURl()).into(image_profile)
      }
      

      希望它会有所帮助。

      【讨论】:

        【解决方案4】:

        只需为 null 添加一个检查

        if (getContext() != null) {
            Glide.with((getContext())).load(user.getImgURl()).into(image_profile);
        }
        

        并在 onDestroyView() 或 onDestroy() 中移除 Firebase 监听器:

        reference.removeEventListener(listener);
        

        【讨论】:

        • 谢谢! destroyer 方法允许上下文不为空。但是我仍然无法查看图像!对此有何看法?
        【解决方案5】:

        我希望它有效。

         Glide.with(view.getContext()).load(user.getImgURl()).into(image_profile);
        

        【讨论】:

          【解决方案6】:

          而不是使用getContext。尝试使用getActivity。一直为我工作。将其放入代码中,我们有:

          Glide.with((getActivity())).load(user.getImgURl()).into(image_profile);
          


          更多详情

          这是一个Activity和一个Context的关系:

            ↳ android.content.Context
                ↳ android.content.ContextWrapper
                    ↳ android.view.ContextThemeWrapper
                        ↳ android.app.Activity
          

          从上图中,我们可以看出 Activity 是一种 Context ,这就是它在这里可用的原因。

          我希望这会有所帮助。快乐的编码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-11
            • 1970-01-01
            相关资源
            最近更新 更多