У меня есть View и один CircleShape, который должен показывать тост в этом представлении. И я использую его в основной деятельности. Это мой интерфейс
interface OnClickListenerInterface { fun onClick() }
Это CircleShape (это View in my xml) и прослушиватель в моем представлении. Я хочу реализовать OnClick в своей работе.
var listener: OnClickListenerInterface? = null mCircleShape.setOnClickListener(View.OnClickListener { if (listener == null) return@OnClickListener listener!!.onClick() })
Я знаю, что в Kotlin получатели и сеттеры генерируют автоматику, но как я могу установить слушателя, если он частный. Это код из моей активности, но он не работает
CircleShape.listener = object :OnClickListenerInterface{ override fun onClick() { ToastUtils.showSuccessMessage(getContext(),"pressed") } }
Как я должен использовать Callback, onClickListenere в Котлине?
Прежде всего, вам нужно удалить этот код:
mCircleShape.setOnClickListener(View.OnClickListener { if (listener == null) return@OnClickListener listener!!.onClick() })
Поскольку слушатель сначала всегда имеет значение null, а ваш код всегда возвращается.
var listener: OnClickListenerInterface? = null
var listener: OnClickListenerInterface? = null
уже является общедоступным (это уровень доступа по умолчанию в Котлине). Поэтому вы можете просто установить его в своей деятельности, когда это необходимо. listener?.onClick()
чтобы вызвать его из CircleShape.
Вы пытаетесь использовать выражение лямбда? Например, в вашем случае:
mCircleShape.setOnClickListener( { _ -> ToastUtils.showSuccessMessage(context,"pressed") } )
Или, если вы хотите сделать его более котлинским стилем:
mCircleShape.listener = ( { _ -> ToastUtils.showSuccessMessage(context,"pressed") } )