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

时间:2019-07-09 17:40:05

标签: android android-fragments kotlin

我非常绝望。我尝试将片段从一个片段打开/替换到另一个片段,我只能从一个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开始,它加载了一个片段,在这个片段内部,我们必须在click事件上加载另一个片段。因此要替换的片段不是当前片段,而是main_activity.xml的内容。

感谢大家的快速解答

6 个答案:

答案 0 :(得分:2)

这很简单,因为它只是活动中的。

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

答案 1 :(得分: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()
}

答案 2 :(得分:0)

使用以下功能来添加或替换任何片段

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
                        )
                    }

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

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

答案 3 :(得分:0)

如果您正在使用片段,则可以获取活动的上下文并从中检索片段管理器。因此,在片段类内部执行此操作

FragmentManager fm = ((Activity) getContext).getSupportFragmentManager();

不是您有片段管理器,您只需要要添加/替换其他片段的容器的ID,就可以了。

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

答案 4 :(得分: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)

答案 5 :(得分:0)

如果有人在乎,我将这段代码放在片段上后,我将第二个片段更改为FrameLayout

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