在 Kotlin 中从另一个片段打开片段

3
我完全绝望了。我尝试从一个片段打开/替换到另一个片段,但我只能在Activity中找到文档或Java中(使用getFragmentManager()方法,似乎在Kotlin中不存在)。
supportFragmentManager仅在Activity内部可用,而我正在使用一个片段和适配器。
你能帮帮我吗?
我认为展示我的代码是无意义的,因为它只会导致错误。
没有一种答案对我起作用。 我尝试了其他方法并创建了一个接口:
interface AdapterCallbackAlbum {
fun onClickItem(album: Album)}

并在我的第一个碎片中实现这个功能

class ListAlbumsFragment : Fragment(), AdapterCallbackAlbum {
  override fun onClickItem(album: Album) {
  val fragment = ListTracksFragment.newInstance()
  val transaction = childFragmentManager.beginTransaction()
  transaction.replace(R.id.album_fragment, fragment)
  transaction.commit()
}

最后是适配器:

    class AlbumAdapter(val context: Context, private val 
    adapterCallbackAlbum: AdapterCallbackAlbum): Adapter<ViewHolder>() {
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, 
    position: Int) {
        val album = albumList[position]
        holder.itemView.setOnClickListener { 
          adapterCallbackAlbum.onClickItem(album)
       }}

但是我得到的唯一结果就是第二个片段放在第一个片段上,即使我调用了“a:”:
transaction.remove(ListAlbumFragment.newInstance())

我的一个朋友终于解决了我的问题(也许可以帮助其他人)。

 override fun onClickItem(album: Album) {
    val fragment = ListTracksFragment.newInstance()
    val transaction = fragmentManager.beginTransaction()
    transaction.replace(R.id.content, fragment)
    transaction.addToBackStack(null)
    transaction.commit()
}

问题在于我们从MainActivity开始,它加载了一个fragment,在这个fragment中,我们需要在点击事件中加载另一个fragment。因此要替换的fragment不是当前的fragment,而是main_activity.xml的内容。

感谢大家的快速回答。


你能发一下你目前尝试过的内容吗? - deHaar
7个回答

4

这很简单,就像在活动中一样,只需按照以下方式操作。

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    childFragmentManager.beginTransaction().replace(R.id.action_container,ChildFragment.getInstance()).commit()
}

我们如何获取 childFragmentManager? - Jorgesys

1
使用以下函数来添加或替换任何片段。
fun addFragment(
fm: FragmentManager,
fragment: Fragment,
container: Int,
replace: Boolean,
addToBackStack: Boolean,
addAnimation: Boolean
) {
val fragmentTransaction = fm.beginTransaction()
if (addAnimation)
    fragmentTransaction.setCustomAnimations(
        R.animator.slide_in_rght,
        R.animator.slide_out_left,
        R.animator.slide_in_left,
        R.animator.slide_out_rght
    )
if (replace)
    fragmentTransaction.replace(container, fragment, fragment.javaClass.name)
else
    fragmentTransaction.add(container, fragment, fragment.javaClass.name)
if (addToBackStack)
    fragmentTransaction.addToBackStack(fragment.javaClass.name)
 fragmentTransaction.commit()
}

在您的片段类中,如果您想打开另一个片段,则可以调用上述函数:
fragmentManager?.let {
                        addFragment(
                            it, ABCFragment(), android.R.id.content, false,  true,
                            true
                        )
                    }

or

addFragment(
                        activity?.supportFragmentManager
                        , SignupFinalStepFragment.newInstance(
                            phoneNumber = phoneNumber?:"",
                            emailAddress = emailAddress ?: ""
                        ), android.R.id.content, false, addToBackStack = true,
                        addAnimation = true
                    )

这两个方法调用是相同的,唯一的区别是activity?.supportFragmentManager应该是非空的。


1
如果您正在使用 Fragment,可以获取活动的上下文并从中检索片段管理器。因此,在片段类内部执行以下操作:
FragmentManager fm = ((Activity) getContext).getSupportFragmentManager();

现在您已经有了片段管理器,您只需要容器的ID即可添加/替换其他片段。

fm.beginTransaction().add(R.layout.container_id, OtherFragmentObject()).commit();

1
这不是 Kotlin! - Jorgesys

1
在您的CurrentFragment中,重写onActivityCreated方法,如下所示:
override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    yourOwnButton.setOnClickListener{

        requireActivity().supportFragmentManager.beginTransaction()
            .replace(R.id.your_fragment_container, AnotherFragment.newInstance())
            .commit()
    }
}

在你的AnotherFragment内部,你应该有一个如下的伴生对象:

companion object {
    fun newInstance() = StudentFragment()
}

0

如果有人关心的话,我把第二个片段改成了一个FrameLayout,在我将这段代码放到我的片段中之后。

 childFragmentManager.beginTransaction()
            .replace(R.id.mFragment,secondFragment())
            .commit()

0

以下是在 Kotlin 中从一个 Fragment 导航到另一个 Fragment 的方法:

<fragment
        android:id="@+id/titleFragment"
        android:name="com.dheeraj.guessbro.title.TitleFragment"
        android:label="title_fragment"
        tools:layout="@layout/title_fragment">
       <action
            android:id="@+id/action_titleFragment_to_gameFragment"
            app:destination="@id/gameFragment" />
    </fragment>

然后转到TitleFragment.kt文件,只需使用此代码:

binding.btn_open.setOnClickListener { findNavController(this).navigate(R.id.action_titleFragment_to_gameFragment) }

如果您没有使用视图绑定,则可以使用findViewById首先定义变量,然后使用clickListener。


0
   //try it 
    fun commitFragmenttoFragment(fragmentManager: FragmentManager, fragment: Fragment, tag: String) {
            val fragmentTransaction = fragmentManager.beginTransaction()
            fragmentTransaction.replace(R.`enter code here`id.fragment_main, fragment)
            fragmentTransaction.addToBackStack(null)
            fragmentTransaction.commit()
        }

    //in this fragment us activity!!.supportFragmentManager

    commitFragmenttoFragment(activity!!.supportFragmentManager,AddManageValue(), AddManageValue().TAG)

感谢您的回答,请尝试解释您的解决方案如何以及为什么有效。 - mightyWOZ

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