java - 使用 supportFragmentManager 推送新 Fragment

标签 java android android-fragments kotlin android-recyclerview

我在 onBindViewHolder 中,我想在 holder.view.setOnClickListener { }

显示一个新 fragment

我正在适配器中传递当前 fragment :

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

最佳答案

您必须在适配器构造中传递Context

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

无论您想在何处添加新 fragment ,请添加以下代码:

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

希望这有帮助。

关于java - 使用 supportFragmentManager 推送新 Fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61420934/

相关文章:

java - 目标无法访问, 'null' 在 JSF 中返回 null

java - 带 super 的通配符

java - 在pom.xml 和settings.xml 中覆盖Maven 属性的顺序是什么?

安卓 : How to write a unit test for fragment depending on a viewmodel Live data attribute?

android 布局不填满屏幕,在左侧、右侧和顶部留下填充

android - 使用 Android 主题更改应用程序范围的字体大小

java - 更新值 Netbeans

android - 如何知道 FragmentManager 后栈是否弹出任何内容?

android - 两个 fragment 之间的通信(android)

android - 从 TabHost fragment 中更新 BadgeView