Android onclick of XML не работает, когда OnClickListener реализован в кнопке customview - PullRequest
1 голос
/ 22 апреля 2020

Мне нужна небольшая анимация, когда пользователь нажимает кнопку, а когда анимация заканчивается, она должна выполнить действие щелчка.

XML

<com.customview.CustomButton
            android:id="@+id/btn_submit"
            bind_fontStyle="@{@string/button_bold}"
            android:layout_width="@dimen/standard_button_width"
            android:layout_height="@dimen/standard_button_height"
            android:text="@{viewModel.btnText}"
            android:onClick="@{()->viewModel.onButtonClick(true)}"
            android:visibility="@{viewModel.isButtonVisible() ? View.VISIBLE : View.GONE}"
            />

пользовательский класс

class CustomButton : AppCompatButton, View.OnClickListener {

constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
    context,
    attrs,
    defStyle
) {
    init()
}

constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
    init()
}

constructor(context: Context) : super(context) {
    init()
}

private fun init() {
    setOnClickListener(this)
}

override fun onClick(v: View) {
    v.post(Runnable {
        v.animate().scaleX(1.05f).scaleY(1.05f).setDuration(200).withEndAction {
            v.animate().scaleX(1f).scaleY(1f).setStartDelay(200)

        }
    })
}

}

Я попытался переопределить OnClickListener в пользовательском представлении, и при нажатии я сделал анимацию, но проблема в том, что она не вызывает android: onClick из xml.

1 Ответ

1 голос
/ 22 апреля 2020

Это не будет работать, потому что вы пытаетесь настроить прослушиватели с несколькими щелчками на представлении в следующих местах:

android:onClick="@{()->viewModel.onButtonClick(true)}"

и

setOnClickListener(this)

Если я правильно понимаю ваш вопрос, один раз пользователь нажимает кнопку, сначала должна выполняться анимация, а затем должно быть выполнено действие в соответствующей модели представления.

Вы можете реализовать интерфейс между вашим классом CustomButton и вашей ViewModel

interface CustomButtonClickListener {
fun onClick()
}

Реализуйте этот интерфейс в вашей ViewModel. При связывании данных отправьте этот прослушиватель интерфейса на пользовательскую кнопку с пользовательскими атрибутами. Примерно так:

<data>
<variable name="vm"
          type="*path_vm*" />
</data>

И передать этот vm своей CustomLabel

app:listener="@{vm}"

Вы можете сослаться this , чтобы создать пользовательские атрибуты для своего класса CustomLabel

Теперь, когда анимация вашей кнопки заканчивается, вам нужно только вызвать метод интерфейса, и переопределенный метод ViewModel должен быть вызван

listener.onClick()

Дайте мне знать, если у вас есть какие-либо другие вопросы:)

...