У меня есть активность - MainActivity, которая служит контейнером для 5 фрагментов.
Переключение фрагментов идет по нажатию на BottomNavigationView, вот так - (Объекты фрагментов были инициализированы в методе OnCreate() и вынесены в поля класса)
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
if(item.getItemId() != view.getSelectedItemId()) {
fragmentTransaction = getSupportFragmentManager().beginTransaction();
if (menuItems.indexOf(item.getItemId()) > menuItems.indexOf(view.getSelectedItemId())) {
fragmentTransaction.setCustomAnimations(R.animator.fragment_slide_left_anim, R.animator.fragment_slide_right_anim);
} else {
fragmentTransaction.setCustomAnimations(R.animator.fragment_slide_right_exit_anim, R.animator.fragment_slide_left_exit_anim);
}
switch (item.getItemId()) {
case R.id.action_contacts:
fragmentTransaction.replace(R.id.main_fragment_container, contactsFragment);
break;
case R.id.action_cloud:
fragmentTransaction.replace(R.id.main_fragment_container, cloudFragment);
break;
case R.id.action_messages:
fragmentTransaction.replace(R.id.main_fragment_container, messagesFragment);
break;
case R.id.action_profile:
fragmentTransaction.replace(R.id.main_fragment_container, profileFragment);
break;
case R.id.action_settings:
fragmentTransaction.replace(R.id.main_fragment_container, settingsFragment);
break;
}
fragmentTransaction.commitAllowingStateLoss();
}
return true;
}
А вот например один из фрагментов (Этот фрагмент содержит еще в себе два фрагмента в виде TabLayout)
public class ProfileFragment extends MvpAppCompatFragment implements ProfileFView {
private MainActivity activity;
@BindView(R.id.tabs)
TabLayout tabLayout;
@BindView(R.id.viewpager)
ViewPager viewPager;
private InfoProfileFragment infoProfileFragment;
private DecorationsProfileFragment decorationsProfileFragment;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@SuppressLint("InflateParams") View view = inflater.inflate(R.layout.fragment_profile, null);
ButterKnife.bind(this, view);
activity = (MainActivity) getActivity();
infoProfileFragment = new InfoProfileFragment();
decorationsProfileFragment = new DecorationsProfileFragment();
setupViewPager(viewPager);
tabLayout.setupWithViewPager(viewPager);
return view;
}
private void setupViewPager(ViewPager viewPager){
TwoTabsViewPagerAdapter adapter = new TwoTabsViewPagerAdapter(getChildFragmentManager());
adapter.addFragment(infoProfileFragment, "Информация");
adapter.addFragment(decorationsProfileFragment, "Украшения");
viewPager.setAdapter(adapter);
}
@Override
public void showMessage(String message) {
Snackbar.make(activity.layout, message, Snackbar.LENGTH_LONG).show();
}
}
А есть практически пустые фрагменты, где только один TextView.
Загрузка пустых фрагментов происходит достаточно быстро, но вот более тяжелые фргаменты, для них занимает примерно полсекунды, чтобы показаться на экране. Это ощутимо влияет на UX.
В статических переменных я не храню контекст, так что утечки в данном случае быть не может.
Возможно ли это как-нибудь исправить (улучшить), либо придется смириться, что тяжелые фрагменты будут дольше загружаться?
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости