Я пытаюсь создать макет, который показывает пейджер представления, когда устройство отображается в портретной ориентации, и две панели, когда устройство находится в горизонтальной ориентации.
Итак, я создал два разных файла макета, один из которых содержит толькоViewPager, другой с LinearLayout, а другой с двумя FrameLayout, я не думаю, что нужно показывать их здесь.Существует также логическое значение hasTwoPanes
для двух конфигураций.
@Inject FragmentOne fragmentOne;
@Inject FragmentTwo fragmentTwo;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
boolean hasTwoPanes = getResources().getBoolean(R.bool.hasTwoPanes);
TabLayout tabLayout = findViewById(R.id.tab_layout);
ViewPager viewPager = findViewById(R.id.view_pager);
if (hasTwoPanes) {
tabLayout.setVisibility(View.GONE);
} else {
tabLayout.setVisibility(View.VISIBLE);
tabLayout.setupWithViewPager(viewPager);
viewPager.setAdapter(new MyPagerAdapter(fm));
}
FragmentOne frag1 = (FragmentOne) fm.findFragmentByTag(getFragmentName(0));
if (frag1 != null) fragmentOne = frag1;
FragmentTwo frag2 = (FragmentTwo) fm.findFragmentByTag(getFragmentName(1));
if (frag2 != null) fragmentTwo = frag2;
if (hasTwoPanes) {
if (frag1 != null) {
fm.beginTransaction().remove(fragmentOne).commit();
fm.beginTransaction().remove(fragmentTwo).commit();
fm.executePendingTransactions();
}
fm.beginTransaction().add(R.id.frame_frag1, fragmentOne, getFragmentName(0)).commit();
fm.beginTransaction().add(R.id.frame_frag2, fragmentTwo, getFragmentName(1)).commit();
}
}
private class MyPagerAdapter extends FragmentPagerAdapter {
MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
return fragmentOne;
} else {
return fragmentTwo;
}
}
@Override
public int getCount() {
return 2;
}
}
private static String getFragmentName(int pos) {
return "android:switcher:" + R.id.view_pager + ":" + pos;
}
Два фрагмента вводятся с помощью Dagger.Если никакие фрагменты уже не присутствовали, эти вставленные фрагменты добавляются в пейджер представления или макет в зависимости от ориентации.
Поскольку адаптер пейджера представления дает имя своим фрагментам, мне нужно знать это имя (следовательно,getFragmentName(int pos)
метод), чтобы вернуть этот фрагмент после поворота.
В результате состояние корректно восстанавливается при повороте из портретной в альбомную ориентацию, но при повороте из альбомной ориентации пейджер просмотра полностью пуст.Когда я поворачиваюсь назад к ландшафту, фрагменты появляются снова.Макет вкладки также глючит, анимации смахивания нет, я могу просто непрерывно перемещаться с одной вкладки на другую, останавливаясь где угодно.
Чтобы прояснить ситуацию, это происходит в Деятельности, родительского фрагмента нет.Даже если фрагменты не показаны, фрагмент называется onViewCreated
.Пейджер представления, кажется, правильно восстанавливает ссылки фрагмента в instantiateItem
.Кроме того, при отладке фрагменты имеют значение added
, равное true, и hidden
, равное false.Это создает впечатление рендеринга в пейджере вида.
- Как заставить пейджер представления отображать мои фрагменты?
- Есть ли лучший способ добиться желаемого поведения?