Привязка данных Android onLongClick не работает

У меня есть текстовое представление, для которого мне нужно создать слушателя для onLongClick. Прямо сейчас для соответствующей модели просмотра есть функция sendLogs (), которая занимается логикой onClick. Если я изменю onClick на функцию onLongClick, никогда не получу вызова. Есть ли способ заставить его работать для onLongClick?

onClick напрямую связан с моей функцией класса модели, но не с onLongClick. Поэтому я считаю, что привязка класса модели правильная, но здесь мне может потребоваться дополнительная работа.

<data>
    <import type="android.view.View" />

    <variable
        type="com.aaa.bbb.viewmodel.SystemSettingsViewModel"
        name="systemSettings"
    </variable>
</data>

<TextView
    android:gravity="end"
    android:id="@+id/tv_logging"
    android:layout_centerVertical="true"
    android:layout_height="wrap_content"
    android:layout_marginRight="8dp"
    android:layout_width="wrap_content"
    android:onClick="@{() -> systemSettings.sendLogs()}"
    android:text="@string/enable_logs"
    android:textAlignment="viewEnd" />

person M P Mathugama    schedule 11.10.2017    source источник
comment
Отправьте вам полный xml-код   -  person Burhanuddin Rashid    schedule 11.10.2017
comment
@BurhanuddinRashid Я добавил привязку макета. Это все связано с этой проблемой.   -  person M P Mathugama    schedule 11.10.2017
comment
Ничего такого сложного не было, вы должны были попробовать, см. Мой ответ ниже.   -  person Akshay Katariya    schedule 11.10.2017


Ответы (6)


У меня получилось правильно сработать. Я сомневаюсь, что это должным образом задокументировано.

В xml

android:onLongClick="@{(view) -> presenter.onLongClickOnHeading(view)}"

В классе presenter viewmodel

public boolean onLongClickOnHeading(View v) { 
   //logic goes here
   return false; 
}

Примечание: эта подпись метода должна быть именно в этом формате. В противном случае во время выполнения будут возникать ошибки привязки.

person M P Mathugama    schedule 13.10.2017
comment
Параметр возврата для сигнатуры метода должен быть логическим. - person Jovin; 24.01.2018
comment
Это должно быть логическое значение, в отличие от обычного OnClick, и AS не покажет, что это является причиной сбоя сборки. Так что знайте об этом. - person MwBakker; 19.12.2018
comment
Спасибо за возвращаемый параметр для метода - person Ho Luong; 15.08.2020

Вот полный код.

Для долгого нажатия такого атрибута нет. Итак, нам нужно создать адаптер привязки.

BindingUtils.kt

object BindingUtils {

    private const val ON_LONG_CLICK = "android:onLongClick"

    @JvmStatic
    @BindingAdapter(ON_LONG_CLICK)
    fun setOnLongClickListener(
        view: View,
        func : () -> Unit
    ) {
        view.setOnLongClickListener {
            func()
            return@setOnLongClickListener true
        }
    }
}

Макет

<androidx.constraintlayout.widget.ConstraintLayout
    android:background="?android:attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:onLongClick="@{() -> vm.onLongClick()}"/> 
person Shahbaz Hashmi    schedule 27.07.2020
comment
В одном файле .xml я использовал onLongClick без этого метода, и он работал без проблем, а в другом - нет, показывая странную ошибку компиляции. Это было решено при использовании этого метода. Спасибо. - person epic; 12.09.2020

Чтобы он работал, часть в скобках должна соответствовать сигнатуре метода из интерфейса View.OnLongClickListener, который выглядит следующим образом:

boolean onLongClick(View view);

Итак, вот как я заставил это работать:

<View
...
android:onLongClick="@{(view) -> listener.onLongClick(view, viewmodel)}"/>
...
person Pafoid    schedule 12.02.2018

Вам следует изучить этот документ

OnLongClick так же просто, как onClick

В вашем SystemSettingsViewModel вы можете иметь

public boolean onLongClick(){}

и в xml

android:onLongClick="@{() -> presenter.onLongClick()}"
person Ravi    schedule 12.10.2017
comment
Да так и должно быть. Я читал этот документ и пробовал раньше. Но безрезультатно. Компилятору не удалось скомпилировать с android: onLongClick () - person M P Mathugama; 13.10.2017
comment
Решено с той же проблемой, также отладчик не показывает точную проблему, но 150 строк пустоты, пока он не сообщает мне 1 ошибку в качестве сводки Мое решение заключалось в том, что метод в слушателе / ​​обработчике ДОЛЖЕН быть логическим - person MwBakker; 19.12.2018

Как указано в Link документации Google, проблем с тем, что вы написал.

Это образец OnLongClick в XML:

android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"

class Presenter {
    fun onLongClick(view: View, task: Task): Boolean { }
}
person Ehsan    schedule 21.10.2019

В разделе xml вы должны сослаться на логическую функцию возврата, такую ​​как следующий код, чтобы не столкнуться с проблемами. В проекте сборки android studio

в xml

android:onLongClick="@{(view) -> presenter.onLongClick(view)}"

в java

  public boolean onLongClick(View v) {
    return false;
}
person younes    schedule 22.10.2020