向对话框中添加片段

15

我想向对话框(可以是DialogFragment或常规对话框)添加一个片段。我该怎么做?

这是我的DialogFragment:

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

我认为问题出在我应该添加到的Activity的FragmentManager上,而不是当前的FragmentManager。但是我找不到对应于DialogFragment的FragmentManager在哪里?


2
getChildFragmentManager().beginTransaction().... - user
谢谢,但这只适用于API 17,是吗? - Kalisky
1
使用原生的片段,就像它们从4.2版本开始引入的那样。但是你总是可以选择来自支持兼容包的片段,它可以使用相同的getChildFragmentManager()方法。 - user
哦...由于旧的v4版本找不到它...找到了这个:http://stackoverflow.com/questions/15805574/android-support-v4-app-fragment-undefined-method-getchildfragmentmanager,谢谢! - Kalisky
2个回答

15

12

对话框的布局 - 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" 中的片段只是由Android Studio生成的PlusOneFragment。


2
注意:当您显示对话框超过一次时,可能会出现一些问题。 静态填充的片段将把该片段添加到对话框的 ownerActivity 的 fragmentManager 中,当您关闭对话框时,该片段仍然存在。因此下次填充时会抛出异常。 - sailing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接