Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


GetChildFragmentManager () en Fragmentos programáticamente (dinámicamente) agregados?

¿Cómo utilizar (o "Podemos utilizar") getChildFragmentManager() en forma programática (dinámicamente) agregó Fragment s?

Aquí está mi ejemplo.

Tengo una MainActivity , una OuterFrag y una InnerFrag . Voy a agregar el OuterFrag a MainActivity dinámicamente por el FragmentManager . Y también, InnerFrag el InnerFrag al OuterFrag también dinámicamente por el FragmentManager . Pero quiero añadir InnerFrag exactamente como un niño del OuterFrag , no reemplazando OuterFrag y ser el nuevo hijo de MainActivity .

Quiero mantener esta jerarquía: MainActivity -> OuterFrag -> InnerFrag . Así MainActivity siempre puede llamar a OuterFrag.

Pero NO cambia de esta jerarquía: MainActivity -> OuterFrag a esta jerarquía: MainActivity -> InnerFrag que MainActivity perderá el OuterFrag .

Aquí está mi código de ejemplo.

MainActivity.java

 package com.example.frag; import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new OuterFrag()).commit(); getSupportFragmentManager().executePendingTransactions(); System.out.println("Before: " + getSupportFragmentManager().findFragmentById(R.id.frameLayout)); ((OuterFrag) getSupportFragmentManager().findFragmentById(R.id.frameLayout)) .addInnerFrag(); System.out.println("After: " + getSupportFragmentManager().findFragmentById(R.id.frameLayout)); } } 

Activity_main.xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/frameLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" > </FrameLayout> 

OuterFrag.java

 package com.example.frag; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class OuterFrag extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.outer_frag, container, false); } public void addInnerFrag() { getFragmentManager().beginTransaction().replace(this.getId(), new InnerFrag()).commit(); getFragmentManager().executePendingTransactions(); // getChildFragmentManager().beginTransaction().add(this.getId(), new InnerFrag()).commit(); // getChildFragmentManager().executePendingTransactions(); } } 

Outer_frag.xml

 <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="i am the OUTER frag" /> 

InnerFrag.java

 package com.example.frag; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class InnerFrag extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.inner_frag, container, false); } } 

Inner_frag.xml

 <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="i am the INNER frag" /> 

Actualmente, el código anterior puede ejecutarse sin errores. Pero en realidad está cambiando InnerFrag como el nuevo hijo de MainActivity . Esto puede verificarse por las dos instrucciones System Print Out que se cambia el objeto Before: Object y After: Object. En el OuterFrag.java , si las sentencias getChildFragmentManager() se ejecutan en lugar de las getFragmentManager() , obtendremos el siguiente error de tiempo de ejecución:

 12-07 02:29:38.406: E/AndroidRuntime(12051): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.frag/com.example.frag.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f070000 (com.example.frag:id/frameLayout) for fragment InnerFrag{46e32748 #0 id=0x7f070000} 

Usar getChildFragmentManager() es teóricamente correcto. Se puede usar en un fragmento no agregado mediante programación (lo que significa cambiar <FrameLayout> a <fragment> , agregar el atributo android:name="com.example.frag.OuterFrag" y quitar el primer getSupportFragmentManager() En MainActivity.java ). Y es mantener la jerarquía correcta: MainActivity -> OuterFrag -> InnerFrag . Pero las palabras del fragmento original ( outer_frag.xml ) nunca se pueden quitar.

En conclusión, quiero referenciar OuterFrag en MainActivity siempre. Y quiero que OuterFrag actúe como un marcador de posición para cargar diferentes InnerFrag . En resumen, quiero llamar a getChildFragmentManager() en OuterFrag , cuando se agrega mediante programación (dinámicamente).

  • ¿Cómo agregar margen entre EditText y Soft Keyboard?
  • Cambiar el título de la barra de acción para cada desplazamiento de pestaña en android
  • Fragmento onResume () & onPause () no se llama en backstack
  • Intentar invocar método virtual 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler ()' en una referencia de objeto nulo
  • EXCEPCIÓN FATAL: principal java.lang.NoClassDefFoundError: android.support.v7.internal.widget.TintManager
  • Diferencia y usos de onCreate (), onCreateView () y onActivityCreated () en fragmentos
  • FloatingActionButton expandir en una nueva actividad
  • Cómo reemplazar un fragmento con otro fragmento utilizando el oyente en el primer fragmento
  • 2 Solutions collect form web for “GetChildFragmentManager () en Fragmentos programáticamente (dinámicamente) agregados?”

    En conclusión, quiero referenciar OuterFrag en MainActivity siempre. Y quiero que OuterFrag actúe como un marcador de posición para cargar diferentes InnerFrags. En resumen, quiero llamar a getChildFragmentManager () en OuterFrag, cuando se agrega mediante programación (dinámicamente).

    Si desea esto, haga que su OuterFrag tenga un diseño de contenedor como su contenido y agregue cualquier InnerFrag a ese contenedor. El archivo de diseño para el OuterFrag será:

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragContainer" android:layout_width="match_parent" android:layout_height="match_parent" /> 

    Por supuesto que podría tener otras vistas en el diseño de OuterFrag si lo desea. Entonces su método addInnerFrag será:

     public void addInnerFrag() { getChildFragmentManager().beginTransaction().add(R.id.fragContainer, new InnerFrag()).commit(); getChildFragmentManager().executePendingTransactions(); } 

    El código para agregar el OuterFrag a la actividad principal sigue siendo válido.

    Si quieres llamar a addInnerFrag() dentro de tu código OuterFrag.java , puedes hacerlo así:

    OuterFrag.java:

     @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); addInnerFrag(); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.