Ricerca…


Sintassi

  • <Pulsante ... />
  • Android: onClick = "methodname"
  • button.setOnClickListener (new OnClickListener () {...});
  • classname di classe public implementa View.OnLongClickListener

in linea onClickListener

Supponiamo di avere un pulsante (possiamo crearlo a livello di codice o collegarlo da una vista usando findViewbyId (), ecc ...)

Button btnOK = (...) 

Ora crea una classe anonima e impostala in linea.

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

Utilizzando il layout per definire un'azione di clic

Quando creiamo un pulsante nel layout, possiamo utilizzare l'attributo android:onClick per fare riferimento a un metodo nel codice per gestire i clic.

Pulsante

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

Quindi, nella tua attività, crea il metodo handleClick .

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

Utilizzando lo stesso evento click per una o più viste nell'XML

Quando creiamo qualsiasi vista nel layout, possiamo utilizzare l'attributo android: onClick per fare riferimento a un metodo nell'attività associata o nel frammento per gestire gli eventi di clic.

Layout 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" />

Codice attività / frammento

Nel codice , crea il metodo che hai chiamato, dove v sarà la vista che è stata toccata e fai qualcosa per ogni vista che chiama questo metodo.

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

Se lo desideri, puoi anche utilizzare un metodo diverso per ciascuna vista (in questo caso, ovviamente, non è necessario verificare l'ID).

Ascoltando gli eventi di clic lungo

Per catturare un clic lungo e utilizzarlo è necessario fornire un listener appropriato al pulsante:

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

Definizione di listener esterno

Quando dovrei usarlo

  • Quando il codice all'interno di un listener in linea è troppo grande e il tuo metodo / classe diventa brutto e difficile da leggere
  • Vuoi eseguire la stessa azione in vari elementi (vista) della tua app

Per ottenere ciò è necessario creare una classe che implementa uno degli ascoltatori nell'API di visualizzazione .

Ad esempio, dai aiuto quando fai un clic lungo su qualsiasi elemento:

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

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

Quindi devi solo avere un attributo o una variabile nella tua Activity per usarlo:

HelpLongClickListener helpListener = new HelpLongClickListener(...);

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

NOTA: la definizione dei listener in una classe separata presenta uno svantaggio, non è possibile accedere direttamente ai campi della classe, quindi è necessario passare dati (contesto, vista) tramite il costruttore a meno che non si rendano pubblici gli attributi o si definiscano i geters.

Listener di clic personalizzato per impedire più clic veloci

Per evitare che un pulsante venga attivato più volte in un breve periodo di tempo (diciamo 2 clic in 1 secondo, il che potrebbe causare seri problemi se il flusso non viene controllato), è possibile implementare un SingleClickListener personalizzato.

Questo ClickListener imposta un intervallo di tempo specifico come soglia (ad esempio, 1000 ms).
Quando si fa clic sul pulsante, verrà eseguito un controllo per verificare se il trigger è stato eseguito nell'ultimo periodo di tempo definito e, in caso contrario, verrà attivato.

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

}

E nella classe, SingleClickListener è associato al pulsante in gioco

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

Personalizzazione dello stile del pulsante

Ci sono molti modi possibili per personalizzare l'aspetto di un pulsante. Questo esempio presenta diverse opzioni:


Opzione 0: Usa ThemeOverlay (attualmente il modo più semplice / più veloce)

Crea un nuovo stile nel tuo file di stili:

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>

Quindi nel layout in cui si posiziona il pulsante (ad es. 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>

Opzione 1: crea il tuo stile di pulsante

In values ​​/ styles.xml, crea un nuovo stile per il tuo pulsante:

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>

Quindi nel layout in cui si posiziona il pulsante (ad es. In 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>

Opzione 2: assegna un drawable per ciascuno degli stati dei tuoi pulsanti

Creare un file xml in una cartella disegnabile denominata "mybuttondrawable.xml" per definire la risorsa estraibile di ciascuno degli stati dei pulsanti:

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>

Ciascuno di questi drawable possono essere immagini (ad es. Mybutton_disabled.png) o file xml definiti dall'utente e memorizzati nella cartella dei disegni. Per esempio:

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>

Quindi nel layout in cui si posiziona il pulsante (ad es. 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>

Opzione 3: aggiungi lo stile del tuo pulsante al tema dell'app

Puoi sovrascrivere lo stile del pulsante Android predefinito nella definizione del tema dell'app (in values ​​/ 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>

Opzione 4: sovrapponi un colore allo stile di pulsante predefinito in modo programmatico

Basta trovare il pulsante nella tua attività e applicare un filtro colore:

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

È possibile controllare diversi metodi di fusione qui ed esempi piacevoli qui .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow