Szukaj…


Składnia

  • <Przycisk ... />
  • android: onClick = "nazwa metody"
  • button.setOnClickListener (nowy OnClickListener () {...});
  • klasa publiczna nazwa klasy implementuje View.OnLongClickListener

inline onClickListener

Powiedzmy, że mamy przycisk (możemy go utworzyć programowo lub powiązać z widoku za pomocą findViewbyId () itp.)

Button btnOK = (...) 

Teraz utwórz anonimową klasę i ustaw ją w linii.

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

Użycie układu do zdefiniowania akcji kliknięcia

Kiedy tworzymy przycisk w układzie, możemy użyć atrybutu android:onClick aby odwołać się do metody w kodzie obsługującej kliknięcia.

Przycisk

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

Następnie w swojej aktywności utwórz metodę handleClick .

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

Korzystanie z tego samego zdarzenia kliknięcia dla jednego lub więcej widoków w pliku XML

Kiedy tworzymy dowolny widok w układzie, możemy użyć atrybutu android: onClick, aby odwołać się do metody w powiązanej aktywności lub fragmencie do obsługi zdarzeń kliknięcia.

Układ 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" />

Kod aktywności / fragmentu

W kodzie utwórz nazwaną metodę, gdzie v będzie widokiem, który został dotknięty, i zrób coś dla każdego widoku, który wywołuje tę metodę.

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;
    }
}

Jeśli chcesz, możesz również użyć innej metody dla każdego Widoku (w tym przypadku oczywiście nie musisz sprawdzać identyfikatora).

Słuchanie zdarzeń długiego kliknięcia

Aby złapać długie kliknięcie i użyć go, musisz podać odpowiedni przycisk nasłuchiwania:

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);

Definiowanie zewnętrznego nasłuchiwania

Kiedy powinienem go użyć?

  • Gdy kod wewnątrz odbiornika wbudowanego jest zbyt duży, a twoja metoda / klasa staje się brzydka i trudna do odczytania
  • Chcesz wykonać tę samą akcję w różnych elementach (widok) swojej aplikacji

Aby to osiągnąć, musisz utworzyć klasę implementującą jeden z detektorów w interfejsie API View .

Na przykład, pomóż, gdy długo klikniesz dowolny element:

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

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

Następnie musisz mieć atrybut lub zmienną w swoim Activity aby go użyć:

HelpLongClickListener helpListener = new HelpLongClickListener(...);

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

UWAGA: zdefiniowanie detektorów w oddzielnej klasie ma jedną wadę: nie ma bezpośredniego dostępu do pól klasy, więc musisz przekazać dane (kontekst, widok) przez konstruktor, chyba że podasz atrybuty jako publiczne lub zdefiniujesz getery.

Odbiornik niestandardowych kliknięć, aby zapobiec wielu szybkim kliknięciom

Aby zapobiec wielokrotnemu uruchamianiu przycisku w krótkim czasie (powiedzmy 2 kliknięcia w ciągu 1 sekundy, co może powodować poważne problemy, jeśli przepływ nie jest kontrolowany), można zaimplementować niestandardowy SingleClickListener .

Ten ClickListener ustawia określony przedział czasu jako próg (na przykład 1000 ms).
Po kliknięciu przycisku zostanie uruchomione sprawdzenie, czy wyzwalacz został wykonany w zdefiniowanym czasie, a jeśli nie, to go wyzwoli.

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);

}

W klasie SingleClickListener jest powiązany z danym przyciskiem

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

Dostosowywanie stylu przycisku

Istnieje wiele możliwych sposobów dostosowania wyglądu przycisku. Ten przykład przedstawia kilka opcji:


Opcja 0: Użyj ThemeOverlay (obecnie najłatwiejszy / najszybszy sposób)

Utwórz nowy styl w pliku stylów:

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>

Następnie w układzie, w którym umieszczasz przycisk (np. 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>

Opcja 1: Utwórz własny styl przycisku

W wartości / styles.xml utwórz nowy styl dla przycisku:

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>

Następnie w układzie, w którym umieszczasz przycisk (np. W 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>

Opcja 2: Przypisywanie rysowania dla każdego stanu przycisku

Utwórz plik xml w folderze do rysowania o nazwie „mybuttondrawable.xml”, aby zdefiniować zasób do rysowania dla każdego z stanów przycisku:

drawable / 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>

Każda z tych plików rysunkowych może być obrazami (np. Mybutton_disabled.png) lub plikami XML zdefiniowanymi przez Ciebie i przechowywanymi w folderze plików rysunkowych. Na przykład:

drawable / 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>

Następnie w układzie, w którym umieszczasz przycisk (np. 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>

Opcja 3: Dodaj styl przycisku do motywu aplikacji

Możesz zastąpić domyślny styl przycisku Androida w definicji motywu aplikacji (w wartości / 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>

Opcja 4: programowo nałóż kolor na domyślny styl przycisku

Wystarczy znaleźć przycisk w swojej aktywności i zastosować filtr kolorów:

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

Możesz sprawdzić różne tryby mieszania tutaj i ładne przykłady tutaj .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow