【问题标题】:How do I programmatically add this fragment to my fragment?如何以编程方式将此片段添加到我的片段中?
【发布时间】:2024-01-14 14:11:01
【问题描述】:

我正在尝试在我的 DialogFragment 中显示嵌套的 ListFragment。

显然我不能只在 XML 中为我的 DialogFragment 布局声明 <fragment>,因为 Fragment-in-fragment 需要 childFragmentManager。所以我试图在我的 DialogFragment 中做到这一点:

Fragment listfragment = new ClassThatExtendsListFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(????????, listfragment).commit();

我完全不知道我需要在 ???????? 中输入什么资源 ID部分,或者我什至会如何分配它。

【问题讨论】:

标签: android android-fragments android-dialogfragment android-listfragment child-fragment


【解决方案1】:

只需在布局中添加 FrameLayout。假设你给它的 id 作为“容器”,

Fragment exampleFragment = new ExampleFragment();
    getSupportFragmentManager().beginTransaction()
            .add(R.id.container, exampleFragment).commit();

【讨论】:

    【解决方案2】:

    我的要求也和你一样。下面的代码对我有用。

    FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        MyTripFragment myTripFragment = new MyTripFragment();
        fragmentTransaction.add(R.id.fragment_container, myTripFragment);
        fragmentTransaction.commit();
    

    XML 代码:

     <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
    
        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      我不确定您为 DialogFragment 使用哪种类型的布局,但通常在 DialogFragment 膨胀的 XML 中,您需要添加一个 FrameLayout 并重要地给它一个 ID。然后,当您进行片段事务时,您传入该 FrameLayout 的资源 id

      XML:

      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">
      
          <FrameLayout
              android:id="@+id/fragment_container"
              android:layout_width="match_parent"
              android:layout_height="match_parent"></FrameLayout>
      </LinearLayout>
      

      如果你想使用嵌套片段,你需要调用getChildFragmentManager()

      FragmentManager fragmentManager = getChildFragmentManager()
      

      那么对于你的片段交易:

      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
      
      fragmentTransaction.replace(R.id.fragment_container, new MyFragment()).commit();
      

      您可能希望使用add 方法而不是replace,但这取决于您

      如果您希望按下启用后退按钮,您可能还想将前一个片段添加到后台堆栈:

      fragmentTransaction.replace(R.id.fragment_container, new MyFragment()).addToBackStack(null).commit();
      

      【讨论】:

      • 这是一个fragment中的一个fragment,所以不能使用常规管理器。我假设的这段代码也在我的对话片段的 oncreatedialog 方法中?
      • 没注意到。在这种情况下,您只需使用 childfragmentmanager 而不是常规的 fragmentmanager。您作为第一个参数传递给 add/replace 方法的内容将是相同的(您希望在其中显示子片段的框架布局的资源 id)
      • 放置此代码的位置取决于您希望 ListFragment 显示的位置/时间。只要您执行上面的代码,片段事务就会被提交并显示出来。因此,只需将其放置在您希望新片段栩栩如生时的适当位置
      • 我如何知道使用添加或替换?如果我用完支持片段怎么办?
      • 您的目标 SDK/API 最低版本是多少?
      最近更新 更多