У меня возникли проблемы с определением правильного способа связи между фрагментами при использовании FragmentPagerAdapter.
Для некоторого контекста у меня есть действие, которое использует FragmentPagerAdapter для размещения двух фрагментов. Фрагмент A имеет кнопку, и при нажатии она меняет текст во фрагменте B.
Все работает так, как ожидалось, за исключением того, что когда я нажимаю кнопку после изменения ориентации, я получаю исключение нулевого указателя в EditText, который я меняю во фрагменте B. После нескольких дней отладки это выглядит так, когда я вызываю метод во фрагменте B, который изменяет текст что это, возможно, старый экземпляр Фрагмента.
Вот код:
FragmentPagerAdapter, который является внутренним классом в моей деятельности:
public class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter (FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
return fragmentA;
case 1:
return fragmentB;
}
return null;
}
@Override
public int getCount() {
return tabs.length;
}
@Override
public CharSequence getPageTitle(int position) {
return tabs[position];
}
}
Фрагменты создаются в методе Activity onCreate следующим образом:
FragmentA fragmentA; //Declared outside of onCreate
FragmentB fragmentB; //Declared outside of onCreate
fragmentA = FragmentA.newInstance();
fragmentB = FragmentB.newInstance();
Во фрагменте, который я нажимаю на кнопку, я настраиваю интерфейс следующим образом:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
testTextInterface = (TestTextInterface) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement testTextInterface");
}
}
Затем, когда я нажимаю кнопку, у меня есть OnClickListener, который запускает следующий код:
testTextInterface.onTextChanged("Some test text");
Что, в свою очередь, вызывает следующий метод в Activity:
@Override
public void onTextChanged(String testText) {
fragmentB.updateText(testText);
}
И, наконец, этот метод в FragmentB:
private void updateText(String incomingText){
myEditText.setText(incomingText);
}
И все, это работает отлично, пока я не поверну устройство, вызывающее воссоздание Activity. Затем, когда я нажимаю кнопку, представление myEditText имеет значение null в FragmentB в методе updateText.
Я пытался понять, почему в течение 2 дней, поэтому мне было интересно, может ли кто-нибудь определить, где я ошибаюсь, или указать мне правильное направление, где я могу понять, что вызывает проблему?
savedInstanceState
нулевым, и только потом прикреплять фрагменты. Кроме того, я бы избавился от обратного вызова onAttach и ссылки, которую вы сохраняете во фрагментах, на активность. Вместо этого, когда вам нужно вызвать слушателя в действии, просто выполнитеgetActivity()
в самом фрагменте. - person Joao Sousa   schedule 21.11.2014