Android
Bouton
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 .