getChildFragmentManager () на программно (динамически) добавленные фрагменты?
Как использовать (или «Можем ли мы использовать»)getChildFragmentManager()
программно (динамически) добавленоFragment
s?
Вот мой пример.
у меня есть такой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
выступать в качестве заполнителя для загрузки различныхInnerFrag
s. Короче хочу позвонитьgetChildFragmentManager()
вOuterFrag
, когда это добавлено программно (динамически).