首页 > 解决方案 > 使用 supportFragmentManager 推送新的 Fragment

问题描述

我在里面onBindViewHolder,我想展示一个新的片段holder.view.setOnClickListener { }

我在我的适配器中传递当前片段:

class HomeAdapter(val fragment: Fragment?) : RecyclerView.Adapter<HomeAdapter.ViewHolder>() {

如果我尝试使用supportFragmentManager 任何东西,如果我点击一行:

fragment
  .requireActivity()
  .supportFragmentManager
  .beginTransaction()
  .add(R.id.main_fragment, GalleryFragment())
  .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
  .addToBackStack("HomeFragment")
  .commit()

但是,如果我使用已弃用的,它可以工作:

fragment
  .requireFragmentManager()
  .beginTransaction()
  .replace(R.id.main_fragment, GalleryFragment())
  .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
  .addToBackStack("HomeFragment")
  .commit()

我不想使用已弃用的。有没有办法来解决这个问题?

编辑:

这是我打电话的班级onClickListener

class DhikrHomeAdapter(val fragment: Fragment?, val data: Array<PreviewDhikr>) : RecyclerView.Adapter<DhikrHomeAdapter.ViewHolder>() {

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

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater = LayoutInflater.from(fragment?.requireContext())
        val cell = inflater.inflate(R.layout.dhikr_row, parent, false)

        return ViewHolder(cell)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val cell = holder.view

        val currentDhikr = data[position]
        cell.dhikrType.text = currentDhikr.dhikrType.rawValue
        val img = fragment?.requireContext()?.resources!!.getIdentifier(currentDhikr.previewImage, "drawable", fragment.requireContext().packageName)
        cell.backgroundImage.setImageResource(img)

        cell.setOnClickListener {
            fragment
                .requireFragmentManager()
                .beginTransaction()
                .replace(R.id.main_fragment, DhikrFragment(currentDhikr))
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .addToBackStack("HomeFragment")
                .commit()
        }
    }

    class ViewHolder(val view: View): RecyclerView.ViewHolder(view)
}

标签: javaandroidandroid-fragmentskotlinandroid-recyclerview

解决方案


您必须通过Context适配器构造

class HomeAdapter(val context: Context?) : RecyclerView.Adapter<HomeAdapter.ViewHolder>() {...}

无论您想在哪里添加新片段,请添加以下代码:

FragmentManager fm = ((AppCompatActivity)context).getSupportFragmentManager();
fm.beginTransaction()
  .add(R.id.main_fragment, new GalleryFragment())
  .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
  .addToBackStack("GallaryFragment")
  .commit();

希望这可以帮助。


推荐阅读