getChildFragmentManager () на программно (динамически) добавленные фрагменты?

Как использовать (или «Можем ли мы использовать»)getChildFragmentManager() программно (динамически) добавленоFragments?

Вот мой пример.

у меня есть такойMainActivity, одинOuterFrag, и одинInnerFrag, Я добавлюOuterFrag вMainActivity динамическиFragmentManager, А также я добавлюInnerFrag кOuterFrag также динамическиFragmentManager, Но я хочу добавитьInnerFrag именно как дитяOuterFrag, не заменяяOuterFrag и быть новым ребенкомMainActivity.

Я хочу сохранить эту иерархию:MainActivity -> OuterFrag -> InnerFrag, Таким образом, MainActivity всегда может вызвать OuterFrag.

Но НЕ меняйте эту иерархию:MainActivity -> OuterFrag к этой иерархии:MainActivity -> InnerFrag этоMainActivity потеряетOuterFrag.

Вот мой пример кода.

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" />

В настоящее время приведенный выше код может работать без ошибок. Но это на самом деле меняетсяInnerFrag как новое дитяMainActivity, Это можно проверить с помощью двух операторов System Print Out о том, что объект Before: Object и After: Object изменены. вOuterFrag.javaеслиgetChildFragmentManager() заявления выполняются вместоgetFragmentManager() заявления, мы получим следующую ошибку времени выполнения:

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}

С помощьюgetChildFragmentManager() теоретически правильно. Его можно использовать в непрограммически добавленном фрагменте (что означает изменениеactivity_main.xml«s<FrameLayout> в<fragment>добавить атрибутandroid:name="com.example.frag.OuterFrag"и удалите первыйgetSupportFragmentManager() заявление вMainActivity.java). И это сохраняет правильную иерархию:MainActivity -> OuterFrag -> InnerFrag, Но слова оригинального фрагмента (outer_frag.xml) никогда не может быть отобран.

В заключение хочу сослатьсяOuterFrag вMainActivity всегда. И я хочуOuterFrag выступать в качестве заполнителя для загрузки различныхInnerFrags. Короче хочу позвонитьgetChildFragmentManager() вOuterFrag, когда это добавлено программно (динамически).

Ответы на вопрос(2)

Ваш ответ на вопрос