Necesito ayuda para trabajar en el fragmento dentro del fragmento, de hecho, estoy enfrentando un problema al presionar el botón Atrás. La pantalla principal de la aplicación tiene botones y al presionar en la vista de cada botón, reemplace con un nuevo fragmento (y ese fragmento contiene dentro de otro fragmento), agregar / reemplazar dinámicamente el fragmento funciona bien, presionando el fragmento button1 reemplazado, lo mismo sucede al presionar el botón, pero si presiono el botón nuevamente, obtuvo una excepción:
"Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with
another fragment for com........ fragmentname"
significa que ya se agregaron fragmentos o fragmentos internos y estoy tratando de agregarlos nuevamente, cualquiera tiene idea de cómo trabajar con el fragmento dentro del fragmento y moverse hacia adelante y hacia atrás sin ningún problema, gracias por el apoyo.
MainActivity, donde los fragmentos se agregan y reemplazan dinámicamente.
public class FragmentInsideFragmentTestActivity extends Activity {
private Button button1;
private Button button2;
private Button button3;
private Button button4;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1 =(Button) this.findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button2 =(Button) this.findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button3 =(Button) this.findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button4 =(Button) this.findViewById(R.id.button4);
button4.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
}
public void onButtonClick(View v) {
Fragment fg;
switch (v.getId()) {
case R.id.button1:
fg=FirstFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button2:
fg=SecondFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button3:
fg=FirstFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button4:
fg=SecondFragment.newInstance();
replaceFragment(fg);
break;
}
}
private void replaceFragment(Fragment newFragment) {
FragmentTransaction trasection = getFragmentManager().beginTransaction();
if(!newFragment.isAdded()) {
try {
//FragmentTransaction trasection =
getFragmentManager().beginTransaction();
trasection.replace(R.id.linearLayout2, newFragment);
trasection.addToBackStack(null);
trasection.commit();
} catch (Exception e) {
// TODO: handle exception
// AppConstants.printLog(e.getMessage());
} else {
trasection.show(newFragment);
}
}
}
Aquí está el diseño: main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1" />
<Button
android:id="@+id/button2"
android:text="Button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button3"
android:text="Button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button4"
android:text="Button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" />
</LinearLayout>
Espero haber tratado de aclarar mi problema.
fuente
Respuestas:
AFAIK, los fragmentos no pueden contener otros fragmentos.
ACTUALIZAR
Con las versiones actuales del paquete de soporte de Android, o fragmentos nativos en API Nivel 17 y superior, puede anidar fragmentos mediante
getChildFragmentManager()
. Tenga en cuenta que esto significa que debe usar la versión del paquete de soporte de Android de fragmentos en los niveles de API 11-16, porque a pesar de que hay una versión nativa de fragmentos en esos dispositivos, esa versión no tienegetChildFragmentManager()
.fuente
getChildFragmentManager()
y la eliminaciónsetRetainInstance(true)
del fragmento interno (lástima) lo reparó. Gracias por salvar mi tocino nuevamente, @CommonsWare.Necesitaba más contexto, así que hice un ejemplo para mostrar cómo se hace esto. Lo más útil que leí mientras me preparaba fue esto:
Actividad
activity_main.xml
Agregue un
FrameLayout
a su actividad para contener el fragmento padre.MainActivity.java
Cargue el fragmento primario e implemente los oyentes de fragmentos. (Ver fragmento de comunicación ).
Fragmento principal
fragment_parent.xml
Agregue otro
FrameLayout
contenedor para el fragmento hijo.ParentFragment.java
Uso
getChildFragmentManager
deonViewCreated
configurar el fragmento niño.Fragmento de niño
fragment_child.xml
No hay nada especial aquí.
ChildFragment.java
Aquí tampoco hay nada demasiado especial.
Notas
fuente
Desde Android 4.2 (API 17) fragmentos anidados están disponibles http://developer.android.com/about/versions/android-4.2.html#NestedFragments
Para colocar un fragmento dentro de otro fragmento, use getChildFragmentManager ()
¡También está disponible en la biblioteca de soporte!
fuente
Se pueden agregar fragmentos dentro de otros fragmentos, pero luego deberá eliminarlo del Fragmento principal cada vez que
onDestroyView()
se llame al método del fragmento principal. Y nuevamente agréguelo en elonCreateView()
método del Fragmento principal .Solo haz esto:
fuente
onActivityCreated()
él se agregaron dos fragmentos, uno en cada una de las vistas, usandogetFragmentManager()
. Esto funcionó la primera vez, pero al girar y reanudar solo uno de los fragmentos era visible. El comportamiento fue correcto en sugetChildFragmentManager()
lugar. El enfoque sugerido aquí arrojó una excepción ya que la actividadonSaveInstanceState()
ya había sido convocada. Confirmar la transacción usandocommitAllowingStateLoss()
evitó la excepción pero no resolvió el problema original.Resolví este problema. Puede usar la biblioteca de soporte y
ViewPager
. Si no necesita deslizar por gesto, puede desactivarlo. Así que aquí hay un código para mejorar mi solución:PS: Es un código feo para la prueba, pero mejora que sea posible.
El fragmento interno de PPS debe pasarse a
ChildFragmentManager
ViewPagerAdapter
fuente
Puedes usar la
getChildFragmentManager()
función.ejemplo:
Fragmento principal:
Diseño principal (
parent_fragment.xml
):Fragmento de niño:
fuente
No es nada complicado No podemos usar
getFragmentManager()
aquí. Para usar Fragmentos dentro de un Fragmento , usamosgetChildFragmentManager()
. El descanso será igual.fuente
Puede agregar
FrameLayout
al fragmento y reemplazarlo con otro fragmento cuando se inicializa.De esta manera, podría considerar que el otro fragmento está dentro del primer fragmento.
fuente
Use getChildFragmentManager (), siga el enlace: Fragmento anidado
fuente
Actualmente en fragmentos anidados, los anidados solo se admiten si se generan mediante programación. Por lo tanto, en este momento no se admite el diseño de fragmentos anidados en el esquema de diseño xml.
fuente
Eso puede ayudar a aquellos que trabajan en Kotlin , puede usar la función de extensión, así que cree un archivo kotlin, digamos "util.kt" y agregue este código
Digamos que esta es la clase del niño.
Ahora puedes agregar a los niños al fragmento de padre como este
donde R.id.fragmet_field es la identificación del diseño que contendrá el fragmento. Este lyout está dentro del fragmento padre, por supuesto. Aquí hay un ejemplo
father_fragment.xml :
fuente
No hay soporte para
MapFragment
, el equipo de Android dice que está trabajando en ello desde Android 3.0. Aquí más información sobre el problema Pero qué puede hacer al crear un Fragmento que devuelva aMapActivity
. Aquí hay un ejemplo de código. Gracias a inazaruk:Cómo funciona :
FragmentActivity
y aloja dos MapFragments.MapView.
LocalActivityManagerFragment
hosts LocalActivityManager.LocalActivityManagerFragment
y con la ayuda deTabHost
crea una instancia interna de MyMapActivity.Si tienes alguna duda por favor avísame
fuente
Hola, resolví este problema poniendo cada Fragmento en un diseño distinto, e hice visible el Diseño relacionado e hice desaparecer las demás visibilidades.
Quiero decir:
Supuse que abrirá su página cuando haga clic en el botón 1. Puede controlar la visibilidad de su fragmento en la acción de hacer clic. Puede hacer que el Diseño relacionado sea visible y los demás desaparecidos y por Fragment Manager puede tomar su fragmento. Este enfoque funcionó para mí. Y dado que la vista tiene visibilidad: desaparecido es invisible, y no ocupa espacio para el diseño, creo que este enfoque no causa ningún problema de espacio.
PD: acabo de intentar explicar que mi código de solución puede tener errores de sintaxis o estructura incompleta.
fuente