Добавление фрагмента в диалог

Я хочу добавить в диалог фрагмент (это может быть как DialogFragment, так и обычный Dialog). Как я могу это сделать?

Вот мой диалоговый фрагмент:

public class MyDialogFragment extends DialogFragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        MyDialogFragment2 dialog = new MyDialogFragment2();
        View v = inflater.inflate(R.layout.news_articles, container, false);
        getActivity().getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, dialog).commit();
        return v;
    }

}

Вот файл news_article.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Вот моя основная деятельность:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            MyDialogFragment dialog = new MyDialogFragment();
            dialog.show(getSupportFragmentManager(), "asdf");
        }
    });
}

Но когда я пытаюсь это сделать, я получаю:

No view found for id 0x7f070002 for fragment MyDialogFragment2

Я думаю, это потому, что FragmentManager Activity не тот, к которому я должен добавлять, но я не могу найти один из DialogFragment, где он?


person Kalisky    schedule 18.08.2013    source источник
comment
Спасибо, но это работает только из API 17, не так ли?   -  person Kalisky    schedule 18.08.2013
comment
С нативными фрагментами да, так как они были введены с 4.2. Но у вас всегда есть вариант фрагментов из пакета поддержки совместимости, который работает с тем же getChildFragmentManager() методом.   -  person user    schedule 18.08.2013
comment
О... не смог найти из-за старой версии v4... нашел это: stackoverflow.com/questions/15805574/, спасибо!   -  person Kalisky    schedule 18.08.2013


Ответы (2)


Ответ (спасибо @Luksprog) использует getChildFragmentManager вместо getActivity().getSupportFragmentManager

Он был недоступен для меня, потому что мне пришлось обновить банку support-v4, как описано здесь: android.support.v4.app.Fragment: неопределенный метод getChildFragmentManager()

person Kalisky    schedule 18.08.2013

Макет для диалога — R.layout.view_with_plus

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.util.me.TestActivity"
    >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Details"/>
    <fragment
        android:layout_toRightOf="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/email"
        class="com.util.me.test.PlusOneFragment"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>

Как показать диалог

public void showDialog(View vIew){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    View view = this.getLayoutInflater().inflate(R.layout.view_with_plus, null);
    builder.setView(view)
            .setPositiveButton("OK", null)
            .setNegativeButton("Cancel", null);

    AlertDialog dialog = builder.create();
    dialog.show();
}

Фрагмент в class="com.util.me.test.PlusOneFragment" — это всего лишь PlusOneFragment, сгенерированный Android Studio.

person Tinashe    schedule 06.06.2014
comment
Внимание, это может иметь некоторые проблемы, когда вы показываете диалоговое окно более одного раза. Статический фрагмент раздувания добавит фрагмент в менеджер фрагментов ownerActivity диалогового окна, когда вы закроете диалоговое окно, фрагмент все еще будет там. Так что в следующий раз, когда вы раздуете, будет выброшено исключение. - person sailing; 04.07.2019