У меня есть эта активность, которая содержит фрагмент. Эта компоновка фрагмента состоит из пейджера представления с несколькими фрагментами (два, фактически).
Когда создается пейджер представления, его адаптер создается, getItem
получает вызов, и мои подфрагменты создаются. Отлично.
Теперь, когда я поворачиваю экран, среда обрабатывает повторное создание фрагмента, адаптер создается снова в моем onCreate
из основного фрагмента, но getItem
никогда не вызывается, поэтому мой адаптер содержит неправильные ссылки (фактически нули) вместо двух фрагментов.
Я обнаружил, что диспетчер фрагментов (т.е. диспетчер дочерних фрагментов) содержит массив фрагментов под названием mActive
, который, конечно, недоступен из кода. Однако существует этот метод getFragment
:
@Override
public Fragment getFragment(Bundle bundle, String key) {
int index = bundle.getInt(key, -1);
if (index == -1) {
return null;
}
if (index >= mActive.size()) {
throwException(new IllegalStateException("Fragement no longer exists for key "
+ key + ": index " + index));
}
Fragment f = mActive.get(index);
if (f == null) {
throwException(new IllegalStateException("Fragement no longer exists for key "
+ key + ": index " + index));
}
return f;
}
Я не буду комментировать опечатку:)
Это хак, который я реализовал для обновления ссылок на мои фрагменты, в моем конструкторе адаптера:
// fm holds a reference to a FragmentManager
Bundle hack = new Bundle();
try {
for (int i = 0; i < mFragments.length; i++) {
hack.putInt("hack", i);
mFragments[i] = fm.getFragment(hack, "hack");
}
} catch (Exception e) {
// No need to fail here, likely because it the first creation and mActive is empty
}
Я не горжусь. Это работает, но это уродливо. Какой фактический способ иметь действительный адаптер после вращения экрана?
PS: здесь полный код