Как я могу использовать обратный вызов в Котлине?

У меня есть 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") } )