Суть проблемы такова: я пытаюсь запустить DialogFragment из FragmentActivity. Это представление DialogFragment содержит FrameLayout, который я хотел бы заполнить фрагментом. По сути, FragmentActivity запускает DialogFragment, затем DialogFragment заполняет его FrameLayout фрагментом. Я обыскал Интернет в поисках учебных пособий и собрал кое-что, что (на мой взгляд) должно работать. Однако, независимо от того, что я пытаюсь, я постоянно получаю ошибки.Вот что у меня есть на данный момент:
Это мой макет FragmentActivity (имя файла «activity_interact»):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/activity" >
<Button
android:id="@+id/btnLaunchDialog"
style="@style/btn" />
Это мой макет DialogFragment (имя файла «dialog_overview»):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/dialog" >
<FrameLayout
android:id="@+id/frameDisplay"
style="@style/frame" />
Это мой макет фрагмента (имя файла "fragment_stats"):
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/table" >
<TableRow style="@style/table" >
<TextView
style="@style/display"
android:gravity="right"
android:text="@string/textStr" />
</TableRow>
Вот код Java для моей FragmentActivity:
public class ActivityInteract extends FragmentActivity implements
OnClickListener {
Button btnLaunchDialog;
@Override
protected void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.activity_interact);
btnLaunchDialog = (Button) findViewById(R.id.btnLaunchDialog);
btnLaunchDialog.setOnClickListener(this);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnLaunchDialog:
FragmentManager fm = getSupportFragmentManager();
DialogOverview dialogOverview = new DialogOverview();
dialogOverview.show(fm, "dialog_overview");
break;
}
}
}
Вот мой код DialogFragment:
public class DialogOverview extends DialogFragment implements OnClickListener {
public DialogOverview() {
}
@Override
public View onCreateView(LayoutInflater li, ViewGroup vg, Bundle b) {
View view = li.inflate(R.layout.dialog_overview, vg);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.frameDisplay, new FragmentStats());
ft.commit();
return view;
}
}
Вот код моего фрагмента:
public class FragmentStats extends Fragment {
@Override
public View onCreateView(LayoutInflater li, ViewGroup vg, Bundle b) {
View view = li.inflate(R.layout.fragment_stats, vg);
return view;
}
}
И, наконец, вот ошибка logcat:
06-11 10:07:29.382: E/AndroidRuntime(30013): java.lang.IllegalArgumentException: No view found for id 0x7f060003 for fragment FragmentStats{4169c928 #1 id=0x7f060003}
Я вижу, что это говорит о том, что у меня нет представления для Фрагмента, но у меня есть... (или есть?) Я потерялся здесь любая помощь будет оценена по достоинству. Кроме того, правильно ли я поступаю? Было бы более эффективно повторно использовать FragmentManager? (т. е. передать его из FragmentActivity в DialogFragment)
Обновление: я удалил код для загрузки моего фрагмента в DialogFragment, и теперь DialogFragment отображается без проблем. Таким образом, очевидно (как предполагает ошибка logcat), что-то не так с самим моим фрагментом... однако он соответствует примерам, которые я видел в Интернете. Что заставляет меня задаться вопросом: есть ли проблема с вложением фрагментов таким образом? FragmentActivity, отображающий DialogFragment, который отображает Fragment, заставляет меня пошутить, что «мы не можем пойти дальше», но я не знаю. Могу ли я вложить больше фрагментов?