MotionLayout: MotionScene OnClick переопределяет setOnClickListener - PullRequest
0 голосов
/ 10 апреля 2019

Я только начинаю играть с MotionLayout. Я определил макет активности, используя MotionLayout, который использует MotionScene, чтобы скрыть и показать представление.

Переход MotionScene выглядит следующим образом:

<Transition
    app:constraintSetStart="@id/collapsed"
    app:constraintSetEnd="@id/expanded">

    <OnClick app:target="@id/nextButton"  />

</Transition>

Проблема в том, что при программном добавлении ClickListener к кнопке ничего не происходит:

nextButton.setOnClickListener {
        //do some stuff
    }

Этот слушатель полностью игнорируется, но переход (расширение / свертывание представления) запускается при каждом нажатии. Я видел, где кто-то расширяет MotionLayout для обработки событий щелчка, но кажется, что может быть более простой способ добавить еще один прослушиватель щелчков для кнопки.

Вопрос 1. Есть ли способ добавить ClickListener к цели OnClick при переходе MotionLayout?

Вопрос 2: Есть ли способ сделать переход одноразовым событием? Желаемый результат заключается в том, что если при нажатии кнопки вид свернут, то вид расширяется, но если он уже развернут, он остается развернутым.

Наконец, я использую пространство имен "http://schemas.android.com/apk/res-auto", и документы ясно указывают, что target и mode являются атрибутами для OnClick. Но проект не будет компилироваться, когда я использую mode, потому что его нельзя найти в этом пространстве имен.

Вопрос 3: Я использую правильное пространство имен?

1 Ответ

1 голос
/ 13 апреля 2019
  1. Не могу найти.
  2. Я нашел успех, используя атрибут clickAction со значением "transitionToEnd".Это сделает так, чтобы motionlayout не мог вернуться к startConstraintSet.
<OnClick
      motion:targetId="@+id/rateUsButton"
      motion:clickAction="transitionToEnd"/>
Это пространство имен, которое я использую, а также пространство имен, используемое в примерах, которые я видел.

Просто столкнулся с той же проблемой сегодня.Мне удалось перехватить щелчок, используя setOnTouchListener вместо setOnClickListener в моем коде.

rateUsButton.setOnTouchListener { _, event ->
    if (event.action == MotionEvent.ACTION_UP) {
        // handle the click
    }
    false
}

Я знаю, что это решение не самое лучшее, но я не нашел другого варианта.Возвращение false означает, что касание не было обработано здесь и, следовательно, будет обрабатываться макетом движения.

...