Java button.setOnClickListener(view -> Log.d("MyTag", "clicked!");
Kotlin button.setOnClickListener { Log.d("MyTag", "clicked!") }
В анонимном классе:
Java button.setOnClickListener(new View.OnClickListener() {
private boolean mToggled;
@Override
public void onClick(View view) {
mToggled = !mToggled;
Log.d("MyTag", "toggled? " + mToggled);
}
});
Kotlin button.setOnClickListener(object:View.OnClickListener() {
private var toggled:Boolean = false
override fun onClick(view:View) {
toggled = !toggled
Log.d("MyTag", "toggled? $toggled")
}
})
В подклассе
View
, который всегда будет одинаково реагировать на события
касания:
Java public class MyButton extends Button implements View.OnClickListener {
public MyButton(Context context) {
this(context, null);
}
public MyButton(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MyButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setOnClickListener(this);
}
@Override
public void onClick(View view) {
mToggled = !mToggled;
Log.d("MyTag", "toggled? " + mToggled);
}
}
Android
77 Kotlin class MyButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null,
defStyleAttr: Int = 0) : Button(context, attrs, defStyleAttr), View.OnClickListener {
var toggled = false
init {
setOnClickListener(this)
}
override fun onClick(view: View) {
toggled = !toggled
Log.d("MyTag", "toggled? $toggled")
}
}
Наконец, можно указать имя метода (как строку) в макете XML. Соответству
-
ющий контроллер
Ac ti vi ty
должен иметь общедоступный метод с этим име
-
нем и с сигнатурой, соответствующей сигнатуре метода
View.OnClickListener.
onClick
:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me!"
android:onClick="myClickHandler" />
Обратите внимание, что
Ac ti vi ty
автоматически определит связь и создаст
логику привязки слушателя, не требуя явных ссылок на метод или на
View
:
public class MyAc ti vi ty extends Ac ti vi ty {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myactivity_layout);
}
public void myClickHandler(View view) {
Log.d("MyTag", "View was clicked " + view.toString());
}
}
Обратите внимание, что в каждый конкретный момент времени пред
-
ставление
View
может иметь не более одного слушателя
OnClickListener
. Чтобы
подключить несколько обработчиков событий касания, нужно либо изменить
основного слушателя, чтобы он вызывал других слушателей, либо создать не
-
большую инфраструктуру для поддержки нескольких слушателей. Например,
вот как можно организовать управление списком обработчиков в одном слу
-
шателе:
Java public class CompositeClickListener extends ArrayList implements View.OnClickListener {
78
Пользовательский ввод
@Override
public void onClick(View view) {
for (View.OnClickListener listener : this) {
lister.onClick(view);
}
}
}
Kotlin class CompositeClickListener : ArrayList(), View.OnClickListener {
override fun onClick(view: View) {
for (listener in this) {
listener.onClick(view)
}
}
}
И использовать его:
Java CompositeClickListener listener = new CompositeClickListener();
listener.add(view -> Log.d("MyTag", "hello!");
listener.add(view -> Log.d("MyTag", "hola!");
listener.add(view -> Log.d("MyTag", "bonjour!");
myView.setOnClickListener(listener);
Kotlin val listener = CompositeClickListener()
listener.add(View.OnClickListener{ Log.d("MyTag", "hello!") })
listener.add(View.OnClickListener{ Log.d("MyTag", "hola!") })
listener.add(View.OnClickListener{ Log.d("MyTag", "bonjour!"})
myView.setOnClickListener(listener)
Спектр доступных вариантов может показаться очень широким, но на самом
деле это только верхушка айсберга. Платформа Android предоставляет доступ
к событиям касания на нескольких уровнях, где можно реализовать свою ло
-
гику обработки касания, например запускать обработку касания только после
некоторой задержки, или более либерально (или консервативно) ограничить
область «блуждания» (насколько далеко от представления может произойти
событие касания, чтобы его можно было считать касанием). К счастью, необхо
-
димость управления жестами возникает в очень редких случаях, тем не менее
мы поговорим об этом далее в этой главе.