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