Использование FragmentManager и FragmentTransaction в DialogFragment

Суть проблемы в следующем: я пытаюсь запустить 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" />

This is my DialogFragment's layout (file name is "dialog_overview"):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/dialog" >
<FrameLayout
    android:id="@+id/frameDisplay"
    style="@style/frame" />

This is my Fragment's layout (file name is "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>

Here is the java code for my 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, заставляет меня пошутить, что «мы не можем пойти дальше», но я не знаю. Могу ли я вложить больше фрагментов?


person user1449018    schedule 11.06.2012    source источник
comment
Любой? Я не вижу в этом ничего плохого... Возможно, я упускаю что-то до боли очевидное...   -  person user1449018    schedule 11.06.2012
comment
Итак, я искал больше и наткнулся на этот пост: Использование FragmentTransaction с DialogFragment По-видимому, Dialog - это представление без контейнера. По сути, когда вы пытаетесь загрузить фрагмент в диалоговое окно, он ищет контейнер... который не находит... и вместо того, чтобы сказать "Эй, нет контейнера для диалогового болвана!" он говорит, что для вашего фрагмента нет представления. Я считаю, что заявление о том, что вы не можете добавлять фрагменты к диалоговому фрагменту, было бы хорошей информацией для включения в документацию. Во всяком случае, проблема решена. Я бы закрыл этот вопрос, но я новичок...   -  person user1449018    schedule 11.06.2012
comment
Вы МОЖЕТЕ использовать вложенные фрагменты в DialogFragment. Смотрите мой ответ.   -  person GaRRaPeTa    schedule 01.02.2016


Ответы (1)


На самом деле, вы МОЖЕТЕ добавить вложенный fragment в DialogFragment, НО это не может быть основано на обернутом диалоговом окне.

Вместо переопределения onCreateDialog разверните представление, содержащее ViewGroup, которое будет использовать фрагмент в onCreateView.

Следствием этого является то, что вы не можете использовать DialogFragment, который обертывает AlertDialog, поэтому, если вам нужны положительные и отрицательные кнопки, вам нужно вручную создать их в представлении содержимого.

Также имейте в виду, что вы не можете установить фрагмент в XML. Вам нужно объявить представление контейнера в XML и выполнить транзакцию фрагмента программно.

открытый класс MyDialogFragment расширяет DialogFragment { [...]

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {



    final View view = inflater.inflate(R.layout.dialog_layout, container);

    if (savedInstanceState == null) {
        final ChildFragment fragment = [...];
        getChildFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .commit();
    }

    return view;
    }
}
person GaRRaPeTa    schedule 01.02.2016