Как реализовать кастомный вид внутри некоторых фрагментов? - PullRequest
0 голосов
/ 16 июня 2020

Я хочу реализовать настраиваемое представление в некоторых фрагментах, и это представление не зависит от активности, таким образом я могу поделиться им как общим компонентом пользовательского интерфейса с другими.

Но у меня возникла проблема при попытке использовать FragmentManager для управления этими фрагментами внутри настраиваемого представления. Как мне получить экземпляр FragmentManager? Как правило, мы можем получить его из Activity, но в моем случае, что я должен сделать, было бы более разумным?

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Но у меня возникает проблема при попытке использовать 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
        }
    }
}
0 голосов
/ 16 июня 2020

Если ваше пользовательское представление увеличено фрагментом, у вас есть доступ к getParentFragmentManager, здесь есть дополнительная информация

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