2 votes

Comment corriger la tentative d'invocation d'une méthode d'interface sur une référence d'objet nulle ?

J'essaie d'implémenter un listenner dans un fragment qui me permette de savoir si des données changent dans l'activité mère.

Dans MainActiivty, j'ai ajouté ces lignes de code :

public ListenFromActivity activityListener;
public void setActivityListener(ListenFromActivity activityListener) {
    this.activityListener = activityListener;
}

J'ai ensuite ajouté ces lignes dans la méthode onCreate de la MainActivity :

ConnectFragment connectFragment =new ConnectFragment() ;

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame,connectFragment ).commit(); 

   // this for is used to change data for testing 
    for(int i=0; i<5;i++){
        activityListener.doSomethingInFragment(1+"");
}

Dans ConnectFragment, j'ai d'abord implémenté mon interface :

 public class ConnectFragment extends Fragment implements ListenFromActivity

Ensuite, dans la méthode onCreate, j'ai ajouté ces lignes :

          ((HomeActivity) getActivity()).setActivityListener(ConnectFragment.this);

Ensuite, j'ai mis en œuvre la méthode dans mon interface.

  @Override
public void doSomethingInFragment(String str) {
    System.out.println(" listener from connectFragment "+ str);

}

Voici enfin mon interface :

   public interface ListenFromActivity {
void doSomethingInFragment(String str);
}

1voto

Antonio Points 1061

Si vous écrivez directement une boucle for comme celle-ci dans MainActivity onCreate, elle sera exécutée avant la fonction ((HomeActivity) getActivity()).setActivityListener(ConnectFragment.this); est appelé dans la fonction onCreate du fragment. Par conséquent, la variable activityListener est nulle et vous obtenez une référence d'objet nulle. Il devrait y avoir un délai entre la transaction du fragment et l'utilisation de la fonction activityListener variable.

1voto

prfarlow Points 384

Il semble que vous essayez de faire en sorte que l'activité informe un fragment des modifications apportées aux données. Mais la façon dont vous l'avez paramétré complique trop les choses. Dans votre MainActivity, il semble que vous ayez déjà une référence de champ à votre ConnectedFragment. Tout ce que vous avez à faire est d'appeler connectFragment. doSomethingInFragment("string"); dans votre MainActivity, après avoir créé le fragment et l'avoir ajouté avec une FragmentTransaction.

0voto

Firas Chebbah Points 52

J'ai résolu mon problème en ajoutant :

         ConnectFragment connectFragment = new ConnectFragment();

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, connectFragment).commit();
    setActivityListener(connectFragment); // her i called the setter and i passed the object of ConnectFragment as parameter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X