Инициализированная переменная 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() каждого фрагмента.

Другие вопросы по тегам