Използване на 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