Я создаю простое приложение для изучения фрагментов. Он состоит из bottomNavigationView с тремя пунктами меню и FrameLayout, который служит контейнером для фрагментов и занимает остальное пространство. Выбор элемента переключает фрагмент в FrameLayout с помощью:
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer,selectedFragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit();
Когда я запустил приложение, я заметил, что переходы между фрагментами очень медленные. Профилировщик показал, что это было связано с раздуванием макета каждый раз. Поэтому я изменил метод фрагментов onCreateView (), чтобы раздувать только один раз, а затем возвращал уже раздутый макет.
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(ui == null)
inflateLayout(inflater, container);
return ui;
}
Это частично исправило проблему, потому что первый переход все еще был медленным. Я пытался раздуть пользовательский интерфейс фрагмента в действии, но это привело к ошибке: фрагмент не привязан к контексту. Так что я просто переключился между всеми фрагментами в onCreate () основного действия:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView nav = findViewById(R.id.bottom_nav);
homeFragment = new HomeFragment();
favFragment = new FavFragment();
starFragment = new StarFragment();
nav.setSelectedItemId(R.id.home);
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, starFragment).commit();
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, favFragment).commit();
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, homeFragment).commit();
nav.setOnNavigationItemSelectedListener(listener);
}
Это улучшило ситуацию, но recyclerView, который содержится в StarFragment, все еще создает viewHolders после «реальной» транзакции (инициированной слушателем). ), что занимает 20 мс для одного viewHolder (я выясню почему позже).
Мой вопрос: как сделать эти транзакции между фрагментами быстрыми? Что я пытаюсь сделать правильно, или есть лучший способ?