Реализация setTag() и findViewWithTag() в instantiateItem() для FragmentStatePagerAdapter

Ссылаясь на следующий ответ, я попытался не реализовывать то, что я делал сейчас в проекте, то есть используя следующий код:

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

Потому что из-за текущей реализации все страницы в моем ViewPager были перезагружены снова. Причина в том, почему я реализовал это в 1-м месте, это перезагрузить фрагмент (который был динамическим в соответствии с пользовательским вводом).

Прочитав ссылку, я получил неопределенное представление о том, что я должен был делать, я перепробовал метод instantiateItem(), но в своей попытке setTag() я смутился относительно того, как я должен был это реализовать. Я попробовал следующее:

@Override
public Object instantiateItem(ViewGroup viewgroup, int position) {
    // TODO Auto-generated method stub
    View viewA = viewgroup.getChildAt(0);
    viewA.setTag("FragmentA");
    View viewB  = viewgroup.getChildAt(1);
    viewB.setTag("FragmentB");
    View viewC = viewgroup.getChildAt(2);
    viewC.setTag("FragmentC");
    return super.instantiateItem(viewgroup, position);

}

И в моей реализации интерфейса я назвал следующее:

        PlayingFragment fragment = new PlayingFragment();
        fragment.setArguments(element);
        getSupportFragmentManager().beginTransaction().add(fragment,"NowPlaying").commit();
        adapter.notifyDataSetChanged();
        pager.findViewWithTag("FragmentC");

Текущая реализация дает мне NullPointerException

at: viewA.setTag("FragmentA");

Может ли кто-нибудь помочь мне реализовать эту реализацию setTag() и findViewWithTag()?

Ответ 1

Когда вы вызывали viewA.setTag( "FragmentA" ), группа просмотра не была инициализирована. Это является прямой причиной этого исключения.

Чтобы избежать этой проблемы, вам необходимо установить тег после того, как была создана группа viewGroup, т.е. вы надули макет представления или создали фрагмент.

Например, код по умолчанию для элемента instantiateItem для FragmentStatePagerAdapter выглядит следующим образом.

@Override
public Object instantiateItem(ViewGroup container, int position) {
    // If we already have this item instantiated, there is nothing
    // to do.  This can happen when we are restoring the entire pager
    // from its saved state, where the fragment manager has already
    // taken care of restoring the fragments we previously had instantiated.
    if (mFragments.size() > position) {
        Fragment f = mFragments.get(position);
        if (f != null) {
            return f;
        }
    }

    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }

    Fragment fragment = getItem(position);
    if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
    if (mSavedState.size() > position) {
        Fragment.SavedState fss = mSavedState.get(position);
        if (fss != null) {
            fragment.setInitialSavedState(fss);
        }
    }
    while (mFragments.size() <= position) {
        mFragments.add(null);
    }
    fragment.setMenuVisibility(false);
    fragment.setUserVisibleHint(false);
    mFragments.set(position, fragment);
    mCurTransaction.add(container.getId(), fragment);

    return fragment;
}

Вы можете установить тег в методе getItem при создании фрагмента/представления.