Ответ 1
Вы можете получить доступ к идентификатору контейнера, вызвав
((ViewGroup)getView().getParent()).getId();
У меня есть фрагмент, добавленный с помощью
transaction.add(R.id.content, fragment, null);
и мне нужно запустить новый фрагмент из этого. Но для этого мне нужно знать первый идентификатор вида контейнера фрагмента (R.id.content в моем случае). Как я могу получить это?
Я могу просто использовать этот идентификатор напрямую, но я полагаю, что фрагмент не должен знать такие подробности о родительской активности. Например, невозможно будет использовать этот фрагмент в другом действии в этом случае.
Может быть, "начальный" фрагмент из другого является плохой практикой, и вся логика обработки фрагментов должна обрабатываться самой деятельностью? Но создание приятных последовательностей фрагментов, начинающихся друг с другом, кажется весьма полезным (например, detalView- > moreDetailView- > evenMoreDetailView).
Вы можете получить доступ к идентификатору контейнера, вызвав
((ViewGroup)getView().getParent()).getId();
Не знаю, если я точно понимаю ваш вопрос, но вы получите Container в onCreateView. Полагаю, вы могли бы занести его в локальную переменную.
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
mContainer = container;
...
}
Я думаю, что существует более стандартный способ доступа к представлению, а не использование
((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.
Предположим, что в классе Activity есть экземпляр фрагмента mCurrentFragment
.
Вы можете получить представление контейнера с фрагментами через
int id = mCurrentFragment.getView().getParent().getId();
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment container View