getChildFragmentManager () en fragmentos añadidos mediante programación (dinámicamente)?
¿Cómo usar (o "Podemos usar") getChildFragmentManager()
en agregado programáticamente (dinámicamente) Fragment
s?
Este es mi ejemplo.
Tengo una MainActivity
, uno OuterFrag
, y uno InnerFrag
. Agregaré el OuterFrag
a MainActivity
dinámicamente por el FragmentManager
. Y también, añadiré el InnerFrag
al OuterFrag
también dinámicamente por el FragmentManager
. Pero quiero añadir InnerFrag
exactamente como un niño de la OuterFrag
, no reemplazar OuterFrag
y ser el nuevo niño de la MainActivity
.
Quiero mantener esta jerarquía: MainActivity -> OuterFrag -> InnerFrag
. Así que MainActivity siempre puede llamar a OuterFrag.
Pero NO cambiar de esta jerarquía: MainActivity -> OuterFrag
a esta jerarquía: MainActivity -> InnerFrag
que MainActivity
perderá el OuterFrag
.
Aquí está mi ejemplo codificar.
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 ser verificado por los dos Sistemas Imprimir declaraciones que el Se cambia el objeto Before: y el Objeto After:. En OuterFrag.java
, si se ejecutan las instrucciones getChildFragmentManager()
en lugar de las instrucciones 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 agregado no programáticamente (lo que significa cambiar activity_main.xml
's <FrameLayout>
a <fragment>
, agregar atributo android:name="com.example.frag.OuterFrag"
y eliminar la primera instrucción 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 puede quitar.
En conclusión, quiero hacer referencia a OuterFrag
en MainActivity
siempre. Y quiero OuterFrag
actuar como un marcador de posición para cargar diferentes InnerFrag
s. En resumen, quiero llamar getChildFragmentManager()
en OuterFrag
, cuando se agrega programáticamente (dinámicamente).
2 answers
En conclusión, quiero hacer referencia a 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 añade mediante programación (dinámicamente).
Si desea esto, haga que su OuterFrag
tenga un diseño de contenedor como su contenido y agregue lo que sea InnerFrag
a ese contenedor. El archivo de diseño para 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ías haber otras vistas en el diseño para el OuterFrag
si lo desea. Entonces tu 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-07 06:29:55
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();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-09 13:33:45