Инициализированная переменная Activity фрагмента Android дает нулевое значение
Я создал вид вкладки, используя пример кода на веб-сайте Android. http://developer.android.com/training/implementing-navigation/lateral.html
Я добавил этот код для вызова метода setTitle, который бы устанавливал заголовок.
mViewPager.addOnPageChangeListener(
new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
FragmentInterface f = (FragmentInterface) mSectionsPagerAdapter
.getItem(position);
f.setTitle();
}
});
В моем классе фрагмента я определил setTitle как
@Override
public void setTitle() {
System.out.println("Title " + cellMain);
if (cellMain != null) {
getActivity().getActionBar()
.setTitle(cellMain.cellData.getIPWithPort());
}
}
и у меня также есть кнопка, которая делает:
public void connect(View view) {
System.out.println("Connect " + cellMain);
if (cellMain == null) {
cellMain = CellMain.createAndroid(this,
getActivity().getFilesDir().toString());
getActivity().getActionBar()
.setTitle(cellMain.cellData.getIPWithPort());
}
Сначала я нажимаю кнопку, которая вызывает connect, она выводит сообщение "Connect null", которое ожидается, поскольку оно не было инициализировано.
При повторном нажатии кнопки распечатайте "Connect cell.CellMain@....".
Теперь я меняю вид, выбирая другую вкладку и возвращаясь к той же вкладке.
Метод setTitle() выводит "нулевой заголовок", который не ожидается при инициализации cellMain. Нажатие кнопки все еще печатает "Connect cell.CellMain @...."
Почему мой метод setTitle дает нулевое значение для моей переменной?
2 ответа
Я заметил, что mSectionsPagerAdapter.getItem(position) возвращает новый экземпляр фрагмента, в результате чего переменная всегда равна нулю.
Я вручную создал каждый фрагмент в конструкторе и вернул их соответствующим образом.
public class SectionsPagerAdapter extends FragmentPagerAdapter {
String[] classes;
Fragment[] fragments;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
classes = new String[]{CellView.class.getName(),
ControlPanelView.class.getName()};
fragments = new Fragment[classes.length];
for (int i = 0; i < classes.length; i++) {
fragments[i] = Fragment.instantiate(context, classes[i]);
}
}
@Override
public Fragment getItem(int position) {
//Used to be this line
//return Fragment.instantiate(context, classes[i])
return fragments[position];
}
Думаю, это связано с жизненным циклом фрагментов внутри ViewPager.
ViewPager имеет ограничение на количество активных страниц, которые являются текущими и его более близкими фрагментами (например: если ограничение равно 3, у вас будет активен текущий показанный фрагмент, следующий и предыдущий). Остальное получится через метод onPause().
То же самое происходит при возобновлении фрагмента. Когда вы выводите фрагмент на передний план, фрагменты в этом диапазоне, которые не активны, будут проходить через метод onResume.
В зависимости от количества фрагментов, которые вы имеете, вы можете думать о разных решениях.
Если у вас есть два или три фрагмента, измените offsetLimit viewPager, чтобы он содержал все из них.
viewPager.setOffscreenPageLimit(3);
Если у вас есть больше фрагментов, подумайте о сохранении его состояния в методе onPause() и восстановлении его в onResume() каждого фрагмента.