【问题标题】:How to add a fragment to a layout of a DialogFragment?如何将片段添加到 DialogFragment 的布局中?
【发布时间】:2014-01-21 12:31:21
【问题描述】:

我有一个自定义的DialogFragment,其中包含一个布局、一些 UI 元素和一个 Fragment holder 布局。我需要做的是将内容片段膨胀到支架布局中并在其中提供导航。单击添加的片段内的按钮时,视图将导航到另一个视图。该片段将被同一持有者中的另一个片段替换,即contentFragment1 将显示一些数据,单击预览按钮时,contentFragment1 将替换为contentFragment2。 我在某处读到,您无法将硬编码为xml 的片段替换为另一个片段。 所以我试图将contentFragment1 从对话框片段的onActivityCreated() 添加到viewholder。但是我收到一个错误,即找不到R.id.fragmentHolder 指向的资源。可能的原因是什么?

这是我的DialogFragment 代码:

public class MyDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog customDialog = new Dialog(getActivity());
    customDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    customDialog.setContentView(R.layout.reports_dialog);
    return customDialog;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    android.app.FragmentTransaction fragmentTransaction =getFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.myFragmentHolder, new ReportsListFragment());
    fragmentTransaction.commit();
    super.onActivityCreated(savedInstanceState);
}

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="400dp"
    android:background="@android:color/transparent" >


    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="This is my header text view for the Dialog"
        android:textSize="18sp" />

<RelativeLayout
    android:id="@+id/myFragmentHolder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/headerlayout" >

</RelativeLayout>

【问题讨论】:

  • 也发布 R.layout.reports_dialog 布局

标签: android android-layout android-fragments android-dialogfragment fragmenttransaction


【解决方案1】:

经过多方尝试,我得出一个结论,onCreateDialog() 没有视图,它只是在调用setView() 时设置了视图。

这就是为什么在对话框片段的布局中添加动态(framelayout 标签)或静态片段(片段标签)会出现 no parent viewduplicate id 错误。

要实现上述目的,应该使用onCreateView 和一个可以动态膨胀的框架布局标签。然后将标题和警报按钮添加到布局中。

【讨论】:

  • 这非常有帮助,谢谢!只需实现此方法并返回视图就可以了。
  • 在这种情况下使用 getChildFragmentManager() 而不是 getFragmentManager() 会有所帮助。
【解决方案2】:

R.id.myFragmentHolder 膨胀到对话框的布局,getFragmentManager() 返回活动的管理器,因此它找不到视图。

对于 API 级别 17 中的嵌套片段,您可以使用 getChildFragmentManager()

【讨论】:

【解决方案3】:

请确保 reports_dialog 布局包含一个布局,其 id myFragmentHolder 像这样

<FrameLayout
android:id="@+id/fragment_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" />

【讨论】:

    【解决方案4】:

    这里仅供参考,正如 Brandon 提到的正确答案是使用 getChildFragmentManager(),请记住,android 也会恢复片段的状态。

    添加第一个片段的正确代码是:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // if the saved instance isn't null, the fragment state will be restored by android
        if (savedInstanceState == null) {
            getChildFragmentManager().beginTransaction().add(R.id.myFragmentHolder, new ReportsListFragment()).commit();
        }
    }
    

    在添加视图之后。如果应该同时显示一个片段,以后使用替换。

    如果应该支持 Android 后退按钮,我还建议调用 transaction.addToBackStack(null);

    【讨论】:

      【解决方案5】:

      布局中片段持有者的 ID 是 fragmentHolder 并且您在代码中使用 myFragmentHolder 尝试将其替换为:

       fragmentTransaction.add(R.id.fragmentHolder, new ReportsListFragment());
      

      【讨论】:

      • 哦。我很抱歉。我编辑了 xml 以使其紧凑,并在将代码复制到 stackoverflow 时不小心重命名了 id。 id 在我的代码中正确指向。但它仍然显示相同的错误。
      猜你喜欢
      • 1970-01-01
      • 2015-04-27
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2013-08-20
      • 2012-07-17
      • 2016-09-06
      相关资源
      最近更新 更多