Поиск…


Синтаксис

  • <Кнопка ... />
  • андроид: OnClick = "MethodName"
  • button.setOnClickListener (новый OnClickListener () {...});
  • public class classname реализует View.OnLongClickListener

inline onClickListener

Скажем, у нас есть кнопка (мы можем создать ее программно или связать ее с представлением с помощью findViewbyId () и т. Д.)

Button btnOK = (...) 

Теперь создайте анонимный класс и установите его в строке.

btnOk.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do stuff here...
    }
});

Использование макета для определения действия клика

Когда мы создаем кнопку в макете, мы можем использовать атрибут android:onClick для ссылки на метод в коде для обработки кликов.

кнопка

<Button
    android:width="120dp"
    android:height="wrap_content"
    android:text="Click me"
    android:onClick="handleClick" />

Затем в вашей деятельности создайте метод handleClick .

public void handleClick(View v) {
    // Do whatever.
}

Использование одного и того же события click для одного или нескольких представлений в XML

Когда мы создаем любой вид в макете, мы можем использовать атрибут android: onClick для ссылки на метод в связанной деятельности или фрагменте для обработки событий щелчка.

XML-макет

<Button android:id="@+id/button"
    ...
    // onClick should reference the method in your activity or fragment
    android:onClick="doSomething" />

// Note that this works with any class which is a subclass of View, not just Button
<ImageView android:id="@+id/image"
    ...
    android:onClick="doSomething" />

Код операции / фрагмента

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

public void doSomething(View v) {
    switch(v.getId()) {
        case R.id.button:
            // Button was clicked, do something.
            break;
        case R.id.image:
            // Image was clicked, do something else.
            break;
    }
}

Если вы хотите, вы также можете использовать разные методы для каждого вида (в этом случае, конечно, вам не нужно проверять идентификатор).

Прослушивание событий с длинным кликом

Чтобы поймать длинный клик и использовать его, вам необходимо предоставить соответствующую кнопку для прослушивания:

View.OnLongClickListener listener = new View.OnLongClickListener() {
    public boolean onLongClick(View v) {
        Button clickedButton = (Button) v;
        String buttonText = clickedButton.getText().toString();
        Log.v(TAG, "button long pressed --> " + buttonText);
        return true;
    }
};

button.setOnLongClickListener(listener);

Определение внешнего прослушивателя

Когда следует использовать его

  • Когда код внутри встроенного прослушивателя слишком велик, и ваш метод / класс становится уродливым и трудно читаемым
  • Вы хотите выполнить одно и то же действие в различных элементах (представлении) вашего приложения

Для этого вам необходимо создать класс, реализующий один из слушателей в API просмотра .

Например, дайте помощь, когда вы долго щелкните по любому элементу:

public class HelpLongClickListener implements View.OnLongClickListener 
{
    public HelpLongClickListener() {
    }

    @Override 
    public void onLongClick(View v) {
        // show help toast or popup
    }
}

Тогда вам просто нужно иметь атрибут или переменную в вашей Activity чтобы использовать ее:

HelpLongClickListener helpListener = new HelpLongClickListener(...);

button1.setOnClickListener(helpListener);
button2.setOnClickListener(helpListener);
label.setOnClickListener(helpListener);
button1.setOnClickListener(helpListener);

ПРИМЕЧАНИЕ. Определение слушателей в отдельном классе имеет один недостаток: он не может напрямую обращаться к полям класса, поэтому вам необходимо передать данные (контекст, представление) через конструктор, если вы не используете атрибуты public или не определяете geters.

Пользовательский кликер для предотвращения нескольких быстрых кликов

Чтобы предотвратить многократное срабатывание кнопки за короткий промежуток времени (скажем, 2 клика в течение 1 секунды, что может вызвать серьезные проблемы, если поток не контролируется), можно реализовать пользовательский SingleClickListener .

Этот ClickListener устанавливает определенный временной интервал как порог (например, 1000 мс).
Когда кнопка нажата, будет проверяться, будет ли запускаться триггер за прошедшее время, которое вы определили, и если это не вызвало его.

public class SingleClickListener implements View.OnClickListener {

    protected int defaultInterval;
    private long lastTimeClicked = 0;

    public SingleClickListener() {
        this(1000);
    }

    public SingleClickListener(int minInterval) {
        this.defaultInterval = minInterval;
    }

    @Override
    public void onClick(View v) {
        if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
            return;
        }
        lastTimeClicked = SystemClock.elapsedRealtime();
        performClick(v);
    }

    public abstract void performClick(View v);

}

И в классе, SingleClickListener связан с Button на карту

myButton = (Button) findViewById(R.id.my_button);
myButton.setOnClickListener(new SingleClickListener() {
    @Override
    public void performClick(View view) {
        // do stuff
    }
});

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

Существует много возможных способов настройки внешнего вида кнопки. В этом примере представлены несколько вариантов:


Вариант 0: используйте ThemeOverlay (в настоящее время самый простой / быстрый способ)

Создайте новый стиль в файле стилей:

styles.xml

<resources>
    <style name=“mybutton” parent=”ThemeOverlay.AppCompat.Ligth”>
        <!-- customize colorButtonNormal for the disable color -->
        <item name="colorButtonNormal">@color/colorbuttonnormal</item>
        <!-- customize colorAccent for the enabled color -->
        <item name="colorButtonNormal">@color/coloraccent</item>
    </style>
</resources>

Затем в макете, где вы размещаете свою кнопку (например, MainActivity):

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

            <Button
                android:id="@+id/mybutton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello"
                android:theme="@style/mybutton"
                style="@style/Widget.AppCompat.Button.Colored"/>

</LinearLayout>

Вариант 1. Создайте свой собственный стиль кнопки

В значениях / styles.xml создайте новый стиль для своей кнопки:

styles.xml

<resources>
        <style name="mybuttonstyle" parent="@android:style/Widget.Button">
            <item name="android:gravity">center_vertical|center_horizontal</item>
            <item name="android:textColor">#FFFFFFFF</item>
            <item name="android:shadowColor">#FF000000</item>
            <item name="android:shadowDx">0</item>
            <item name="android:shadowDy">-1</item>
            <item name="android:shadowRadius">0.2</item>
            <item name="android:textSize">16dip</item>
            <item name="android:textStyle">bold</item>
            <item name="android:background">@drawable/button</item>
        </style>
    </resources>

Затем в макете, где вы помещаете свою кнопку (например, в MainActivity):

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

            <Button
                android:id="@+id/mybutton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello"
                android:theme="@style/mybuttonstyle"/>

</LinearLayout>

Вариант 2: назначьте для каждого из состояний кнопки возможность рисования

Создайте xml-файл в выпадающей папке с именем «mybuttondrawable.xml», чтобы определить ресурс, который можно использовать для каждого из состояний ваших кнопок:

рисуем / mybutton.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="false"
        android:drawable="@drawable/mybutton_disabled" />
    <item
        android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/mybutton_pressed" />
    <item
        android:state_focused="true"
        android:state_enabled="true"
        android:drawable="@drawable/mybutton_focused" />
    <item
        android:state_enabled="true"
        android:drawable="@drawable/mybutton_enabled" />
</selector>

Каждый из этих чертежей может представлять собой изображения (например, mybutton_disabled.png) или xml-файлы, определенные вами и сохраненные в папке drawables. Например:

рисуем / mybutton_disabled.xml

<?xml version="1.0" encoding="utf-8"?>

    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <gradient
            android:startColor="#F2F2F2"
            android:centerColor="#A4A4A4"
            android:endColor="#F2F2F2"
            android:angle="90"/>
        <padding android:left="7dp"
            android:top="7dp"
            android:right="7dp"
            android:bottom="7dp" />
        <stroke
            android:width="2dip"
            android:color="#FFFFFF" />
        <corners android:radius= "8dp" />
    </shape>

Затем в макете, где вы размещаете свою кнопку (например, MainActivity):

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

            <Button
                android:id="@+id/mybutton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello"
                android:background="@drawable/mybuttondrawable"/>

</LinearLayout>

Вариант 3: добавьте стиль вашей кнопки в тему приложения

Вы можете переопределить стиль кнопки Android по умолчанию в определении темы вашего приложения (в значениях / styles.xml).

styles.xml

<resources>
     <style name="AppTheme" parent="android:Theme">
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
              <item name="android:button">@style/mybutton</item>
     </style>
    
     <style name="mybutton" parent="android:style/Widget.Button">
             <item name="android:gravity">center_vertical|center_horizontal</item>
                <item name="android:textColor">#FFFFFFFF</item>
                <item name="android:shadowColor">#FF000000</item>
                <item name="android:shadowDx">0</item>
                <item name="android:shadowDy">-1</item>
                <item name="android:shadowRadius">0.2</item>
                <item name="android:textSize">16dip</item>
                <item name="android:textStyle">bold</item>
                <item name="android:background">@drawable/anydrawable</item>
     </style>
</resources>

Вариант 4. Наложение цвета на стиль кнопки по умолчанию программно

Просто найдите кнопку в своей деятельности и примените цветной фильтр:

Button mybutton = (Button) findViewById(R.id.mybutton);
mybutton.getBackground().setColorFilter(anycolor, PorterDuff.Mode.MULTIPLY)

Вы можете проверить различные режимы смешивания здесь и хорошие примеры здесь .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow