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 OuterFragactuar 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).

Author: Fllo, 2012-12-07

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.

 45
Author: Luksprog,
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();
}
 0
Author: ban-geoengineering,
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