Но у меня возникает проблема при попытке использовать FragmentManager для управления этими фрагментами внутри настраиваемого представления. Как я могу получить экземпляр FragmentManager? Как правило, мы можем получить его из Activity, но в моем случае, что мне делать было бы более разумным?
Лучший способ сделать это - определить интерфейс в представлении, чтобы описать, какие события есть, то фрагмент, на котором размещено это представление, будет реализовывать этот интерфейс и фактически обрабатывать его.
fun View.onClick(clickListener: (View) -> Unit) {
setOnClickListener(clickListener)
}
class MyView: FrameLayout {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
interface Listener {
fun onSomeEvent(someData: SomeData)
}
var listener: Listener? = null
override fun onFinishInflate() {
super.onFinishInflate()
val binding = MyViewBinding.bind(this)
with(binding) {
someButton.onClick {
listener?.onSomeEvent(someData)
}
}
}
}
И затем
class MyFragment: Fragment(R.layout.my_fragment), MyView.Listener {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val binding = MyFragmentBinding.bind(view)
with(binding) {
myView.listener = this@MyFragment
}
}
}