如何以编程方式将片段添加到 kotlin 中的片段

时间:2021-03-11 13:17:14

标签: android kotlin

我有一个片段,它实际上是我的应用程序中的一个屏幕...在这个屏幕上,我想根据传递给屏幕片段的模型的属性加载多个片段之一。我将在以下情况下使用条件来执行此操作...但首先:

实际上我什至无法加载基本片段。这是屏幕片段的代码:

类 EditCommandFragment : Fragment() {

private val args by navArgs<EditCommandFragmentArgs>()
private lateinit var fragContainer: ConstraintLayout

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    setHasOptionsMenu(true)

    // Inflate the layout for this fragment
    val view = inflater.inflate(R.layout.fragment_edit_command, container, false)
    //get a reference to the container.
    fragContainer = view.findViewById<ConstraintLayout>(R.id.command_edit_container)
    
    // add one of the edit fragments //this doesn't work
    childFragmentManager.beginTransaction().add(fragContainer, EditCommandUIFragment.newInstance()).commit()

    return view
}

抛出的这个错误是:

不能使用提供的参数调用以下函数:

public open fun add(p0: Fragment, p1: String?): FragmentTransaction defined in androidx.fragment.app.FragmentTransaction
public open fun add(p0: Int, p1: Fragment): FragmentTransaction defined in androidx.fragment.app.FragmentTransaction

但这毫无意义。在所有教程中,我都可以找到您将容器作为 p0 传递,然后将要添加的片段的类作为 p1...但这是要求字符串或整数,什么?

如何将 EditCommandUIFragment 正确添加到容器中?

2 个答案:

答案 0 :(得分:1)

要添加 Fragment,您需要一个 Fragment 实例,而不是它的“视图”(这是 Fragment 的管理职责)。

  1. 使用“推荐方法”构建“子”Fragment 实例:
val yourNewFragment = YourNewFragment.newInstance()
  1. 获取您将放置它的容器...
val container = R.id.place_where_you_will_put_it
  1. 执行交易:
childFragmentManager.beginTransaction().add(container, yourNewFragment, "A TAG or NULL")

现在,请记住,如果您确实使用了标签,那么检查片段是否已经不存在有时是一种很好的做法(这实际上取决于您的应用/生命周期/等)...

val frag = childFragmentManager.findFragmentByTag("The Tag You Used Above")

if (frag == null) { 
   // add it
}

你懂的。

如果您不使用 TAG”,那么您可以使用其他替代方法...

val frag = childFragmentManager.findFragmentById(id of the container where the fragment is supposed to be, aka: R.id.place_where_you_will_put_it)

例如,这可用于 replace(...) 片段,而不是 add

答案 1 :(得分:0)

在我的项目中,我使用 viewPager2 做一些类似于你的事情

实际上,在父片段中,您将其放置在充当视图的 xml 文件中

 <androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="15dp"
        app:layout_constraintTop_toBottomOf="@+id/tabs"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        />

然后创建一个继承自 FragmentStateAdapter 的类

class  ViewPagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {

    private val mFragmentList = ArrayList<Fragment>()
    private val mFragmentTitleList = ArrayList<String>()



    fun addFrag(fragment: Fragment, title: String) {
        mFragmentList.add(fragment)
        mFragmentTitleList.add(title)
    }

    override fun getItemCount(): Int {
        return mFragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return mFragmentList[position]
    }

}

在片段父级的 on-create 之后进行设置(请参阅文档) 例如在我的例子中添加子片段只需调用

 viewPagerAdapter.addFrag(MyFragment(), "Title")

或者说要显示哪个片段

 viewpager.currentItem = 5