Я делаю приложение для Android, это изображение, что у меня сейчас:
Так что у меня есть MainActivity, с FrameLayout и Toolbar.(в некоторых фрагментах мне нужно скрыть панель инструментов, в некоторых изменить ее имя)
В MainActivity у меня есть FrameLayout.
Приложение работает так: у меня есть сервер, на котором я получаю данные.Я сделал репозиторий + viewmodel + aliveata (как в google codelabs) и использовал socket.io для соединения с сервером.
Например, у меня есть 2 фрагмента, чтобы показать некоторую информацию, и как это работает:
Сначала пользователь попадает в FragmentMain (код ниже):
Метод в MainActivity для setFragments
protected void setFragment(Fragment fragment) {
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.fragment_placeholder, fragment);
t.commit();
}
также я использую этот код для связи с базой данных и отображения фактических данных пользователю через советы Google (я имею в виду архитектурные компоненты)
, поэтому в onCreate я звоню
appUpdateViewModel = ViewModelProviders.of(this).get(AppUpdateViewModel.class);
fragmentMain = new FragmentMain();
setFragment(fragmentMain);
во FragmentMain. Я делаю следующие шаги, чтобы показать вложенный фрагмент (компоненты или систему
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
...
((MainActivityPfff)getActivity()).setTextTabBar(getString(R.string.fragment_main_toolbar));
ViewPager viewPager = view.findViewById(R.id.viewPager);
viewPager.setAdapter(new AdapterPagerMain(getActivity(),getFragmentManager()));
...
}
Этот код для AdapterPagerMain
@Override
public Fragment getItem(int position) {
if (position == 0) {
return new FragmentComponents();
} else if (position == 1) {
return new SystemFragment();
} else {
return new SystemFragment(); //notUsing
}
}
И этот код для FragmentComponents (структура ComponentsFragment такая же, но показывает другие данные)
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
...
appUpdateViewModel = ViewModelProviders.of(this).get(AppUpdateViewModel.class);
appUpdateViewModel.getAllAppUpdates().observe(this, new Observer<List<AppUpdate>>() {
@Override
public void onChanged(@Nullable List<AppUpdate> appUpdates) {
adapterUpdates.setUpdates(appUpdates);
}
});
...
}
Когда я показываю FragmentMain, я могу нажать на кнопку и перейти к новому фрагменту (например, FragmentAboutApp), поэтому я делаю это так:
@Override
public void onClick(View view) {
((MainActivity)getActivity()).setFragment(new FragmentAboutApp());
}
Итак, первая проблема, которую я получаю - это когда я нажимаю на кнопку во FragmentAboutApp, которая показывает FragmentMain, я получаю FragmentMain, но без всякого контекстаnt (во FragmentComponents и FragmentSystem у меня есть recyclerViews, получающий информацию из базы данных)
Также я не знаю, является ли правильный способ получения фактических данных (я имею в виду создание новых appViewModels во всех фрагментах и наблюдение за данными).Меня интересует утечка памяти
А также мне интересно использовать вложенные фрагменты.Должен ли я воссоздать это или нет?Мне нужно увеличить производительность до максимального уровня.Или, может быть, мне нужно удалить старый экземпляр фрагментов при переходе на новый?(Пожалуйста, покажите код, как я могу это сделать)
Последний вопрос - я загружаю с сервера большой json-файл с некоторой информацией:
-различные части этой информации, которые я использую в разных фрагментах(но я загружаю только один файл)
Итак, теперь я подключаюсь к серверу в MainActivity и получаю фактический JSON в жизненном цикле MainActivity.Фрагменты просто наблюдают за этой базой данных, а затем она меняется, показывая фактическую информацию
Спасибо!