Это потому, что getItem
( должен ) всегда создает новый экземпляр Fragment
и не фиксирует их в транзакции. ViewPager
получает фрагменты из instantiateItem
или getItem
и фиксирует их в транзакциях, и в конечном итоге они будут присоединены к действию.
Итак, вот фрагмент FragmentPagerAdapter.instantiateItem
:
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
final long itemId = getItemId(position);
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
ViewPager
вызывает instantiateItem
для получения фрагментов, и в рамках метода он проверяет, существуют ли фрагменты, а затем возвращает фрагменты, в противном случае он вызывает getItem
, чтобы создать их новый экземпляр.
Это объясняет, почему ваша активность равна нулю getItem
. Но если ваш getItem
не ( всегда ) возвращает новый экземпляр Fragment
, то, скорее всего, ваше приложение не будет работать, поскольку активность фрагмента может не пережить изменение конфигурации, например поворот экрана.