Как загрузить новый фрагмент в то же пространство, что и текущий фрагмент

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

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

Например, у меня есть Activity, в котором есть WebView, который использует WebViewClient для обработки внутренних взаимодействий js-> java. Мой WebViewClient может запускать другие действия, которые я использовал:

 i = new Intent(context, GoogleMapActivity.class);
 startActivity(i);

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

Итак... есть ли способ внутри Фрагмента, по существу, сказать, что новый Фрагмент загружается в то же пространство, что и текущий Фрагмент, или нужно какое-то взаимодействие с Активностью?

** РЕДАКТИРОВАТЬ **

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


person Martyn    schedule 17.10.2011    source источник
comment
посмотрите на этот вопрос. stackoverflow.com/questions/7790945/   -  person Yashwanth Kumar    schedule 17.10.2011


Ответы (3)


getFragmentManager().beginTransaction()
   .replace(((ViewGroup) getView().getParent()).getId(), fragment)
   .addToBackStack(null)
   .commit();

Это должно заменить родительский контейнер желаемым фрагментом.

person localhost    schedule 16.04.2015

Это должно быть выполнимо через FragementManager.replace(). Взгляните на документацию для Fragment и особенно на более длинный пример. в разделе "Макет" есть.

person Heiko Rupp    schedule 17.10.2011
comment
Учитывая, что есть несколько разных макетов, которые можно использовать, я не всегда знаю, на какой идентификатор мне следует ориентироваться, чтобы поместить фрагмент, поэтому мне нужно знать, есть ли способ сделать это, не зная идентификатора. Или какой подход я должен использовать - т.е. я должен называть все фрагменты одним и тем же идентификатором? - person Martyn; 17.10.2011
comment
вы также можете получить фрагмент с тегом. после этого при замене вместо id вы можете передать первый аргумент как фрагмент. - person Yashwanth Kumar; 17.10.2011

Если вы хотите добавить фрагмент, а не заменить его, используйте:

getFragmentManager().beginTransaction().add(R.id.fragment_container, new Fragment()).commit();
person daniel kilinskas    schedule 24.08.2015