Фрагменты Android следует повторно использовать 1 фрагмент или создавать новые экземпляры?
Я пытаюсь изучить Фрагменты в Android и из разных примеров, которые я нашел там, кажется, это разные способы сделать это, и я просто хотел получить некоторые советы относительно того, что является правильным способом или, по крайней мере, при каких обстоятельствах один путь должен использоваться над другим.
В одном примере создан макет, содержащий фрагмент и FrameLayout. В коде, когда элемент выбран из списка, создается новый фрагмент (с некоторыми данными, которые он требует в конструкторе), а 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);
}
}
Ответы
Ответ 1
Так что мне просто интересно, является ли какой-либо из этих методов предпочтительным по сравнению с другим или существуют определенные обстоятельства, при которых его следует использовать?
Если фактический фрагмент не нужно изменять (т.е. он является тем же классом фрагмента), у меня бы был вызов активности методом на этом фрагменте, а не его заменой (ваш сценарий № 2), если он существует. Это намного дешевле во время выполнения, и, вероятно, проще его кодировать.
Если, однако, фрагмент может быть другим (например, в зависимости от того, что вы нажимаете, могут быть разные фрагменты для разных типов объектов модели, представленных в списке), тогда потребуется замена фрагмента ( ваш сценарий №1). Вы можете оптимизировать случай, когда фрагмент происходит для этого события одного класса, хотя я бы сначала сосредоточился на том, чтобы он работал, просто заменяя фрагмент и беспокоясь об оптимизации, если/когда у вас есть время и наклон.
Я не поклонник вашего # 2 кода структурно. ИМХО, фрагменты не должны разговаривать с другими фрагментами напрямую. Мой предпочтительный образец - это фрагменты, которые "прилипают к их вязанию", фокусируясь исключительно на вещах в их собственных виджетах и моделях. Для событий, которые влияют на другие части пользовательского интерфейса (например, щелчок списка), фрагмент уведомляет об активности (например, через интерфейс прослушивателя). Активность - это та, которая знает, какие фрагменты должны быть вокруг, так как именно они создали их в первую очередь. Затем действие может либо поговорить с другим фрагментом (если оно существует), создать другой фрагмент (если есть место), либо запустить другое действие. Если вы предпочитаете свой подход №2, вы можете его использовать - это просто не то, что я сделал бы в ваших обстоятельствах.