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 .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow