Выдвижение нового фрагмента с supportFragmentManager - PullRequest
0 голосов
/ 25 апреля 2020

Я внутри 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)
}

1 Ответ

0 голосов
/ 25 апреля 2020

Вы должны передать 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();

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...