Подтвердить что ты не робот

Фрагменты 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);

    }

}
4b9b3361

Ответ 1

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

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

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

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