How to fix Attempt to invoke interface method on a null object reference

Viewed 1324

I'm trying to implement a listenner in a fragment that allows me to know if data change inside the parent activity.

Inside MainActiivty, i added those lines of code:

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

Then i added those line inside onCreate methode in the 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+"");
}

In ConnectFragment,I added implemented my interface first :

 public class ConnectFragment extends Fragment implements ListenFromActivity

Then inside onCreate methode i added those line :

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

And then i impelemnted the methode in my interace

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

}

Finaly this is my interface :

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

If you directly write for loop like this in MainActivity onCreate, it will be executed before the ((HomeActivity) getActivity()).setActivityListener(ConnectFragment.this); is called in Fragment's onCreate. Hence the activityListener variable is null and you get a null object reference. There should be a delay between the fragment transaction and using the activityListener variable.

It looks like you're trying to have the Activity tell a Fragment about changes to data. But the way you've set it over-complicating it. In your MainActivity, it looks like you already have a field reference to your ConnectedFragment. All you need to do is call connectFragment. doSomethingInFragment("string"); in your MainActivity, after you have created the fragment and added it with a FragmentTransaction.

I fixed my problem by adding :

         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.
Related