2
votes

getContext () renvoie null dans Fragment. La vue semble être détachée

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

La ligne ci-dessus renvoie getContext comme nul, autorisant ainsi l'application s'écraser. J'ai ajouté ceci dans un fragment sous la méthode onDataChange comme suit.

        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)

Le code est censé récupérer une image du stockage Firebase et l'afficher sur l'image_profile. P >

Ce qui suit est le logcat de l'erreur:

java.lang.NullPointerException: 

Vous ne pouvez pas démarrer un chargement sur une vue non encore attachée ou un fragment où getActivity () renvoie null (qui se produit généralement lorsque getActivity () est appelé avant que le fragment ne soit attaché ou après la destruction du fragment).

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;
}

Toute aide est appréciée. Merci d'avance.


0 commentaires

6 Réponses :


0
votes

Ajoutez simplement une coche à null

reference.removeEventListener(listener);

Et supprimez l'écouteur Firebase dans onDestroyView () ou onDestroy ():

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


1 commentaires

Je vous remercie! La méthode destroyer permet au contexte de ne pas être nul. Cependant, je ne peux toujours pas voir l'image! Une opinion à ce sujet?



0
votes
If(isAdded()) {
   Glide.with((getActivity().getContext())).load(user.getImgURl()).into(image_profile)
}
Hope it will help.

0 commentaires

0
votes

J'espère que cela fonctionne.

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


0 commentaires

1
votes

dans le fragment, utilisez getActivity () pour un contexte comme celui-ci: code ci-dessous:

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


0 commentaires

0
votes

Au lieu d'utiliser getContext . Essayez d'utiliser getActivity . Fonctionne tout le temps pour moi. En mettant cela dans le code, nous avons:

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


Plus de détails

Voici la relation entre une activité et un contexte:

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

De l'illustration ci-dessus, nous pouvons voir que l'activité est un type de contexte et c'est pourquoi il est utilisable ici.

J'espère que cela aide. Joyeux codage.


0 commentaires

1
votes

J'ai vérifié divers éléments sur Internet, enfin celui-ci a fonctionné.

        @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);
            }
        }

Pour en savoir plus sur le cycle de vie des fragments, veuillez parcourir ce lien


1 commentaires

La ligne `` if (getContext ()! = Null) '' l'a corrigé pour moi. Belle solution