Как обрабатывать несколько фрагментов для одного занятия
Я недавно начал смотреть на разработку приложений для моего устройства Android. Для меня этот интерес вызвал то, что я играл с несколькими arduinos, и у меня была прекрасная идея заставить их общаться с моим телефоном, как, например, интерфейс для любых значений, которые я измеряю на самом arduino. Теперь я мог бы выбрать легкий путь и использовать общедоступный источник для достижения этой цели, но научиться этому не так уж и много, и я хотел бы, чтобы это было так, как я хочу.
Теперь я полагаю, что первый вопрос, который мне нужно задать, состоит в том, будет ли несколько фрагментов / одно действие лучшим способом для этого? По сути, я хочу 1 соединение с Arduino, вытащить все значения, но в зависимости от выбранной «вкладки» я хочу, чтобы определенные значения отображались определенным образом. Я решил сделать каждую вкладку отдельным фрагментом и просто отображать значения по-разному. Как я уже сказал, я только начинаю опыт разработки под Android, поэтому у меня не так уж много оснований для этого выбора.
Так что я зациклен на этой идее с несколькими фрагментами:
Создано несколько файлов Fragment.xmlОпределен класс для каждого отдельного представленияСоздан список для отображения доступных фрагментовУстановленный и отображаемый фрагмент при выбореПо сути, мой onMenuItemSelect выглядел следующим образом.
FragmentTransaction FT = getFragmentManager.beginTransaction();
switch(position){
case 1:
FT.replace(R.id.fragment_container, new MyFragment()).commit();
break;
case 2:
FT.replace(R.id.fragment_container, new MySecondFragment()).commit();
break;
}
Приведенный выше код работал, он сделал то, что я хотел, без каких-либо проблем. Мне это не очень нравится, потому что для каждого фрагмента, который я хотел добавить, мне нужно было добавить новый случай в коммутатор. Также это создает новый фрагмент каждый раз, даже если он уже был создан. Это проблема?
Самая большая проблема, с которой я столкнулся, заключается в том, что масштабировать его не так просто. Для 2-3 фрагментов это не самый плохой способ справиться с этим (на мой взгляд). Я хочу, чтобы у меня было столько фрагментов, сколько я хочу, без отдельного случая для каждого переключателя. Итак, я сделал фрагмент-список для хранения одного экземпляра каждого моего фрагмента.
List<Fragment> fragmentList;
private void populateFragmentList();{
fragmentList = new ArrayList<Fragment>();
fragmentList.add(new HomeFrag());
fragmentList.add(new BluetoothFragment());
fragmentList.add(new USBFragment());
fragmentList.add(new RCInfoFragment());
fragmentList.add(new ControllerFragment());
fragmentList.add(new FingerCordsFrag());
}
public void onMenuItemSelect(int position, int curPosition){
if(fragmentList.get(position).isAdded()){
getFragmentManager().beginTransaction().show(fragmentList.get(postition))
.hide(fragmentList.get(curPosition)).commit();
}
else
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentList.get(position)).show(fragmentList.get(position)).hide(fragmentList.get(curPosition)).commit();
}
И этот метод тоже работал. Я мог бы заставить его отображать все мои фрагменты без необходимости каждый раз заново создавать экземпляр каждого фрагмента. Я полагаю, что это делает то, что я хочу, это достаточно хорошо масштабируется (лучше, чем IMO с коммутатором / кейсом). Проблема, которая у меня есть сейчас, в том, что все сходит с ума, когда я меняю ориентацию. До сих пор я только тестировал портретный режим, я не могу просматривать какие-либо свои фрагменты, когда выбираю их в другой ориентации. Я могу запустить его в любой ориентации, и он работает, но когда я изменяю его во время выполнения, я вижу только тот фрагмент, который у меня был открыт, когда я менял ориентацию.
Теперь каждый фрагмент "onCreateView" вызывается, просто отображение не отображается. Я считаю, что я сузил его, чтобы не привязываться к новому действию, созданному из изменения ориентации. Есть ли в любом случае, я могу присоединить фрагменты, которые уже созданы к новому действию.
Таким образом, у меня есть следующие вопросы:
Является ли эта модель хорошим способом для моего приложения?Есть ли достойный способ обработки фрагментов, который хорошо масштабируется? Не могу найти никаких примеров.Является ли использование «new MyFragment ()» каждый раз, когда я открываю другую вкладку, разумным способом для достижения этой цели?Является ли мой способ хранения моих фрагментов в списке разумным способом их обработки?Как заново прикрепить фрагмент к новому действию после изменения ориентации?Спасибо за ваше время.
* Пришлось набирать весь этот код на лету, потому что я по какой-то причине не смог заставить мой C / P-код правильно отформатировать.