Recherche…


Syntaxe

  • <Bouton ... />
  • android: onClick = "methodname"
  • button.setOnClickListener (new OnClickListener () {...});
  • classname de classe publique implémente View.OnLongClickListener

en ligne surClickListener

Disons que nous avons un bouton (nous pouvons le créer par programmation ou le lier depuis une vue en utilisant findViewbyId (), etc ...)

Button btnOK = (...) 

Maintenant, créez une classe anonyme et définissez-la en ligne.

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

Utiliser la mise en page pour définir une action de clic

Lorsque nous créons un bouton dans la présentation, nous pouvons utiliser l'attribut android:onClick pour référencer une méthode dans le code pour gérer les clics.

Bouton

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

Ensuite, dans votre activité, créez la méthode handleClick .

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

Utiliser le même événement de clic pour une ou plusieurs vues dans le XML

Lorsque nous créons une vue dans la présentation, nous pouvons utiliser l'attribut android: onClick pour référencer une méthode dans l'activité ou le fragment associé pour gérer les événements de clic.

Mise en page 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" />

Code d'activité / fragment

Dans votre code , créez la méthode nommée, où v sera la vue touchée, et faites quelque chose pour chaque vue qui appelle cette méthode.

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

Si vous le souhaitez, vous pouvez également utiliser une méthode différente pour chaque vue (dans ce cas, vous n'avez bien sûr pas besoin de vérifier l'ID).

Écouter les événements de clic long

Pour attraper un clic long et l'utiliser, vous devez fournir un écouteur approprié au bouton:

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

Définition d'un écouteur externe

Quand devrais-je l'utiliser

  • Lorsque le code à l'intérieur d'un écouteur en ligne est trop gros et que votre méthode / classe devient moche et difficile à lire
  • Vous souhaitez effectuer la même action dans différents éléments (vue) de votre application

Pour ce faire, vous devez créer une classe implémentant l'un des écouteurs de l' API View .

Par exemple, aidez lorsque vous cliquez longtemps sur un élément:

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

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

Il vous suffit alors d'avoir un attribut ou une variable dans votre Activity pour l'utiliser:

HelpLongClickListener helpListener = new HelpLongClickListener(...);

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

REMARQUE: la définition des écouteurs dans une classe séparée présente un inconvénient: elle ne peut pas accéder directement aux champs de classe. Vous devez donc transmettre des données (contexte, vue) via le constructeur, sauf si vous définissez des attributs publics ou définissez des geters.

Custom Click Listener pour empêcher plusieurs clics rapides

Afin d' empêcher un bouton de se déclencher plusieurs fois dans un court laps de temps (disons 2 clics en moins d'une seconde, ce qui peut causer de sérieux problèmes si le flux n'est pas contrôlé), on peut implémenter un SingleClickListener personnalisé.

Ce ClickListener définit un intervalle de temps spécifique comme seuil (par exemple, 1000 ms).
Lorsque vous cliquez sur le bouton, une vérification est effectuée pour voir si le déclencheur a été exécuté au cours de la période de temps que vous avez définie et sinon, il le déclenchera.

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

}

Et dans la classe, SingleClickListener est associé au Button en jeu

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

Personnalisation du style de bouton

Il existe de nombreux moyens de personnaliser l'apparence d'un bouton. Cet exemple présente plusieurs options:


Option 0: Utiliser ThemeOverlay (actuellement le moyen le plus simple et le plus rapide)

Créez un nouveau style dans votre fichier de styles:

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>

Ensuite, dans la disposition où vous placez votre bouton (par exemple, 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>

Option 1: Créez votre propre style de bouton

Dans values ​​/ styles.xml, créez un nouveau style pour votre bouton:

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>

Ensuite, dans la mise en page où vous placez votre bouton (par exemple dans 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>

Option 2: Attribuez un dessin pour chacun des états de vos boutons

Créez un fichier xml dans un dossier pouvant être dessiné appelé «mybuttondrawable.xml» pour définir la ressource pouvant être dessinée de chacun des états de votre bouton:

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>

Chacun de ces tirables peut être des images (par exemple, mybutton_disabled.png) ou des fichiers xml définis par vous et stockés dans le dossier drawables. Par exemple:

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>

Ensuite, dans la disposition où vous placez votre bouton (par exemple, 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>

Option 3: ajoutez votre style de bouton à votre thème d'application

Vous pouvez remplacer le style de bouton Android par défaut dans la définition du thème de votre application (dans 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>

Option 4: superposer une couleur sur le style de bouton par défaut par programmation

Trouvez simplement votre bouton dans votre activité et appliquez un filtre de couleur:

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

Vous pouvez vérifier différents modes de mélange ici et de bons exemples ici .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow