Фрагменты Android я должен повторно использовать 1 фрагмент или создавать новые экземпляры? - PullRequest
19 голосов
/ 24 марта 2012

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

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

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

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

РЕДАКТИРОВАТЬ: вот код для каждого из двух методов, о которых я говорил:

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 Ответ

20 голосов
/ 24 марта 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...