Android Fragments следует повторно использовать 1 фрагмент или создавать новые экземпляры?

Я пытаюсь изучить Фрагменты в Android и из различных примеров, которые я нашел там, кажется, это разные способы сделать это, и я просто хотел получить некоторые советы относительно того, что является правильным способом или, по крайней мере, при каких обстоятельствах один из способов должен быть Используется над другим.

Один пример создал макет, содержащий фрагмент и FrameLayout. В коде, когда элемент выбран из ListFragment, создается новый фрагмент (с некоторыми данными, которые он требует в конструкторе), и FrameLayout заменяется этим новым фрагментом (используя FragmentTransaction.replace ()).

В другом примере есть файл макета, который объявляет 2 фрагмента бок о бок. Теперь в коде, когда пользователь выбирает элемент из списка в одном фрагменте, выполняется вызов другому фрагменту для обновления данных (на основе выбранного элемента).

Поэтому я просто задаюсь вопросом, является ли какой-либо из этих методов предпочтительным по сравнению с другим или существуют определенные обстоятельства, при которых его следует использовать?

EDIT: вот код для каждого из двух методов, которые я имел в виду:

1:

mCurCheckPosition = index; if (mDualPane) { // We can display everything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager().findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); startActivity(intent); } 

2:

 public void onListItemClick(ListView l, View v, int position, long id) { String item = (String) getListAdapter().getItem(position); DetailFragment fragment = (DetailFragment) getFragmentManager() .findFragmentById(R.id.detailFragment); if (fragment != null && fragment.isInLayout()) { fragment.setText(item); } else { Intent intent = new Intent(getActivity().getApplicationContext(), DetailActivity.class); intent.putExtra("value", item); startActivity(intent); } } 

Поэтому я просто задаюсь вопросом, является ли какой-либо из этих методов предпочтительным по сравнению с другим или существуют определенные обстоятельства, при которых его следует использовать?

Если фактический фрагмент не нужно изменять (т. Е. Он является тем же классом фрагмента), я бы назвал операцию вызовом метода на этом фрагменте, а не заменял его (ваш сценарий № 2), если он существует. Это намного дешевле во время выполнения, и, вероятно, проще также закодировать код.

Если, однако, фрагмент может быть другим (например, в зависимости от того, что вы нажимаете, могут быть разные фрагменты для разных типов объектов модели, представленных в списке), тогда потребуется замена фрагмента (ваш сценарий # 1). Вы можете оптимизировать случай, когда фрагмент происходит для этого события одного класса, хотя я бы сначала сосредоточился на том, чтобы он работал, просто заменяя фрагмент и беспокоясь об оптимизации, если / когда у вас есть время и наклон.

Тем не менее, я не поклонник вашего кода # 2. ИМХО, фрагменты не должны напрямую разговаривать с другими фрагментами. Мой предпочтительный образец – это фрагменты, которые «прилипают к их вязанию», фокусируясь исключительно на вещах в их собственных виджетах и ​​моделях. Для событий, которые влияют на другие части пользовательского интерфейса (например, щелчок списка), фрагмент уведомляет об активности (например, через интерфейс прослушивателя). Деятельностью является тот, который знает, какие фрагменты должны быть вокруг, так как именно он создал их в первую очередь. Затем активность может либо поговорить с другим фрагментом (если он существует), либо создать другой фрагмент (если есть место), либо запустить другое действие. Если вы предпочитаете свой подход №2, вы можете его использовать – это не то, что я сделал бы в ваших обстоятельствах.

Intereting Posts
Установка параметров для завышенного представления внутри RelativeLayout, но получение исключения classcast Как указать ширину и высоту ячеек Android GridLayout в относительных показателях? Сделайте один IAP действительным для разных приложений Espresso – Выполнение действия не работает в полноэкранном режиме – InjectEventSecurityException Какие части платформы Google Android не являются open-source? Android: Можно ли вычислить высоту представления до ее рисования? Почему SQLException не улавливает SQLiteExcpetion? Android включить Bluetoothheadset микрофон Кнопка Android делает 1/3 ширины и высоты экрана в относительной компоновке Отправка двоичных данных через POST на Android Могу ли я использовать одно определение двух кнопок, переключаясь между ними? Получение строки пакета из манифеста Android Получить длительность последнего вызова в android EditText.getText (). ToString () иногда возвращает "" Android Espresso. Как проверить ErrorText в TextInputLayout