Как исправить попытку вызова метода интерфейса для ссылки на пустой объект - PullRequest
2 голосов
/ 27 июня 2019

Я пытаюсь реализовать прослушиватель во фрагменте, который позволяет мне узнать, изменяются ли данные внутри родительской активности.

Внутри MainActiivty я добавил следующие строки кода:

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

Затем я добавил эти строки внутри метода onCreate в 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+"");
}

В ConnectFragment я сначала добавил реализованный интерфейс:

 public class ConnectFragment extends Fragment implements ListenFromActivity

Затем внутри метода onCreate я добавил следующие строки:

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

И затем я реализовал метод в моем взаимодействии

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

}

Наконец, это мой интерфейс:

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

Ответы [ 3 ]

1 голос
/ 27 июня 2019

Похоже, вы пытаетесь, чтобы действие сообщило фрагменту об изменениях данных.Но то, как вы это сделали, слишком усложняет.Похоже, что в вашей MainActivity у вас уже есть ссылка на поле для вашего ConnectedFragment.Все, что вам нужно сделать, это вызвать connectFragment. doSomethingInFragment("string"); в вашей MainActivity, после того как вы создали фрагмент и добавили его с помощью FragmentTransaction.

1 голос
/ 27 июня 2019

Если вы прямо напишите для цикла вроде этого в MainActivity onCreate, он будет выполнен до вызова ((HomeActivity) getActivity()).setActivityListener(ConnectFragment.this); в onCreate фрагмента.Следовательно, переменная activityListener равна нулю, и вы получаете нулевую ссылку на объект.Между транзакцией фрагмента и использованием переменной activityListener должна быть задержка.

0 голосов
/ 28 июня 2019

Я исправил свою проблему, добавив:

         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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...