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

Получить идентификатор контейнера фрагмента

У меня есть фрагмент, добавленный с помощью

transaction.add(R.id.content, fragment, null);

и мне нужно запустить новый фрагмент из этого. Но для этого мне нужно знать первый идентификатор вида контейнера фрагмента (R.id.content в моем случае). Как я могу получить это?

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

Может быть, "начальный" фрагмент из другого является плохой практикой, и вся логика обработки фрагментов должна обрабатываться самой деятельностью? Но создание приятных последовательностей фрагментов, начинающихся друг с другом, кажется весьма полезным (например, detalView- > moreDetailView- > evenMoreDetailView).

4b9b3361

Ответ 1

Вы можете получить доступ к идентификатору контейнера, вызвав

((ViewGroup)getView().getParent()).getId();

Ответ 2

Не знаю, если я точно понимаю ваш вопрос, но вы получите Container в onCreateView. Полагаю, вы могли бы занести его в локальную переменную.

public View onCreateView(LayoutInflater inflater, 
  ViewGroup container,
  Bundle savedInstanceState) {
  mContainer = container;
  ...
}

Ответ 3

Я думаю, что существует более стандартный способ доступа к представлению, а не использование

((ViewGroup) getView().getParent()).getId()

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

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

// Inside of onListItemClick...
FragmentManager fm = getFragmentManager();
Fragment fragment = new MyOtherListFragment();

FrameLayout contentView = (FrameLayout) getActivity().findViewById(R.id.content_view);

fm.beginTransaction()
        .replace(contentView.getId(), fragment)
        .addToBackStack(null)
        .commit();

В приведенном выше примере предполагается, что у вас есть ресурс макета XML, который вы установили в MainActivity, вызовите XML-ресурс R.layout.activity_main, где есть FrameLayout с идентификатором R.id.content_view. Это тот подход, который я принял. Пример, представленный здесь, - это более простая версия из той, которую я на самом деле написал в своем приложении.

Кстати, моя версия IntelliJ (версия 1.0.1) предупреждает меня, что

((ViewGroup) getView().getParent)

может вызывать исключение NullPointerException.

Ответ 4

Предположим, что в классе Activity есть экземпляр фрагмента mCurrentFragment. Вы можете получить представление контейнера с фрагментами через

int id = mCurrentFragment.getView().getParent().getId();
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment container View