getContext()在Fragment中返回null。视图似乎未连接

时间:2019-01-20 10:07:21

标签: java android android-fragments

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上。

以下是该错误的日志记录:

java.lang.NullPointerException: 

您不能在尚未连接的View或其中getActivity()返回null的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)

感谢您的帮助。 预先谢谢你。

6 个答案:

答案 0 :(得分:1)

在片段中使用getActivity()进行如下操作:  下面的代码:

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

答案 1 :(得分:1)

检查了Internet上的各种内容,终于可以了。

        @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

答案 2 :(得分:0)

只需将检查添加为空

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

并在onDestroyView()或onDestroy()中删除Firebase侦听器:

reference.removeEventListener(listener);

答案 3 :(得分:0)

If(isAdded()) {
   Glide.with((getActivity().getContext())).load(user.getImgURl()).into(image_profile)
}

希望这会有所帮助。

答案 4 :(得分:0)

我希望它能起作用。

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

答案 5 :(得分:0)

代替使用sql+= ", commodityPricePerKg = ? "; 。尝试使用getContext。一直为我工作。将其放入代码中,我们可以:

getActivity


更多详细信息

这是活动和上下文之间的关系:

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

从上面的插图中,我们可以看到Activity是一种Context,这就是为什么它在这里可用的原因。

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