Android
Taste
Suche…
Syntax
- <Button ... />
- android: onClick = "methodname"
- button.setOnClickListener (new OnClickListener () {...});
- public class classname implementiert View.OnLongClickListener
inline onClickListener
Angenommen, wir haben eine Schaltfläche (wir können sie programmgesteuert erstellen oder sie mithilfe von findViewbyId () usw. aus einer Ansicht binden).
Button btnOK = (...)
Erstellen Sie nun eine anonyme Klasse und setzen Sie sie inline.
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do stuff here...
}
});
Verwenden des Layouts zum Definieren einer Klickaktion
Wenn wir im Layout eine Schaltfläche erstellen, können wir das Attribut android:onClick
, um auf eine Methode im Code zu verweisen, die Klicks verarbeitet.
Taste
<Button
android:width="120dp"
android:height="wrap_content"
android:text="Click me"
android:onClick="handleClick" />
Erstellen handleClick
anschließend in Ihrer Aktivität die handleClick
Methode.
public void handleClick(View v) {
// Do whatever.
}
Verwenden Sie dasselbe Click-Ereignis für eine oder mehrere Ansichten in XML
Wenn wir eine Ansicht im Layout erstellen, können wir das Attribut android: onClick verwenden, um auf eine Methode in der zugeordneten Aktivität oder im zugehörigen Fragment zu verweisen, um die Klickereignisse zu verarbeiten.
XML-Layout
<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" />
Aktivitäts- / Fragmentcode
Erstellen Sie in Ihrem Code die von Ihnen benannte Methode, wobei v die berührte Ansicht ist, und führen Sie für jede Ansicht, die diese Methode aufruft, etwas aus.
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;
}
}
Wenn Sie möchten, können Sie für jede Ansicht auch eine andere Methode verwenden (in diesem Fall müssen Sie natürlich nicht nach der ID suchen).
Hören Sie sich die Long Click-Events an
Um einen langen Klick abzufangen und zu verwenden, müssen Sie den entsprechenden Listener für die Schaltfläche angeben:
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);
Externen Listener definieren
Wann sollte ich es benutzen?
- Wenn der Code in einem Inline-Listener zu groß ist und Ihre Methode / Klasse hässlich wird und schwer zu lesen ist
- Sie möchten dieselbe Aktion in verschiedenen Elementen (Ansichten) Ihrer App ausführen
Dazu müssen Sie eine Klasse erstellen, die einen der Listener in der View-API implementiert.
Geben Sie beispielsweise Hilfe, wenn Sie lange auf ein Element klicken:
public class HelpLongClickListener implements View.OnLongClickListener
{
public HelpLongClickListener() {
}
@Override
public void onLongClick(View v) {
// show help toast or popup
}
}
Dann brauchen Sie nur ein Attribut oder eine Variable in Ihrer Activity
, um sie verwenden zu können:
HelpLongClickListener helpListener = new HelpLongClickListener(...);
button1.setOnClickListener(helpListener);
button2.setOnClickListener(helpListener);
label.setOnClickListener(helpListener);
button1.setOnClickListener(helpListener);
ANMERKUNG: Das Definieren von Listenern in getrennten Klassen hat einen Nachteil. Sie kann nicht direkt auf Klassenfelder zugreifen. Daher müssen Sie Daten (Kontext, Ansicht) über den Konstruktor übergeben, sofern Sie keine Attribute öffentlich machen oder Geter definieren.
Benutzerdefiniert Klicken Sie auf Listener, um mehrere schnelle Klicks zu verhindern
Um zu verhindern , dass eine Schaltfläche innerhalb kurzer Zeit mehrmals ausgelöst wird (beispielsweise 2 Klicks innerhalb einer Sekunde, was zu schwerwiegenden Problemen führen kann, wenn der Fluss nicht gesteuert wird), kann ein benutzerdefinierter SingleClickListener implementiert werden .
Dieser ClickListener legt ein bestimmtes Zeitintervall als Schwellenwert fest (z. B. 1000 ms).
Wenn Sie auf die Schaltfläche klicken, wird geprüft, ob der Auslöser in der von Ihnen definierten Zeit ausgeführt wurde. Wenn nicht, wird er ausgelöst.
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);
}
In der Klasse wird der SingleClickListener mit dem betreffenden Button verknüpft
myButton = (Button) findViewById(R.id.my_button);
myButton.setOnClickListener(new SingleClickListener() {
@Override
public void performClick(View view) {
// do stuff
}
});
Anpassen der Schaltflächenart
Es gibt viele Möglichkeiten, das Aussehen eines Buttons anzupassen. Dieses Beispiel bietet mehrere Optionen:
Option 0: ThemeOverlay verwenden (derzeit der einfachste / schnellste Weg)
Erstellen Sie einen neuen Stil in Ihrer Stildatei:
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>
Dann in dem Layout, wo Sie Ihren Button platzieren (zB 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: Erstellen Sie Ihren eigenen Schaltflächenstil
Erstellen Sie in values / styles.xml einen neuen Stil für Ihre Schaltfläche:
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>
Dann in dem Layout, wo Sie Ihren Button platzieren (zB 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>
Option 2: Weisen Sie jedem Button-Status ein Zeichen zu
Erstellen Sie eine XML-Datei mit dem Namen 'mybuttondrawable.xml' in einem zeichnbaren Ordner, um die zeichnungsfähigen Ressourcen für jeden Ihrer Schaltflächenstatus zu definieren:
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>
Bei jedem dieser Zeichensätze kann es sich um Bilder (z. B. mybutton_disabled.png) oder XML-Dateien handeln, die von Ihnen definiert und im Zeichnungsordner gespeichert werden. Zum Beispiel:
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>
Dann in dem Layout, wo Sie Ihren Button platzieren (zB 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: Fügen Sie Ihrem App-Design Ihren Schaltflächenstil hinzu
Sie können den Standardstil für Android-Schaltflächen in der Definition Ihres App-Designs (in values / styles.xml) überschreiben.
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: Überlagern Sie eine Farbe programmgesteuert mit dem Standardschaltflächenstil
Finden Sie einfach Ihre Schaltfläche und wenden Sie einen Farbfilter an:
Button mybutton = (Button) findViewById(R.id.mybutton);
mybutton.getBackground().setColorFilter(anycolor, PorterDuff.Mode.MULTIPLY)
Sie können verschiedene Füllmethoden überprüfen hier und schöne Beispiele hier .