Zoeken…


Syntaxis

  • <Knop ... />
  • android: onClick = "methodname"
  • button.setOnClickListener (nieuwe OnClickListener () {...});
  • public class classname implementeert View.OnLongClickListener

inline onClickListener

Stel dat we een knop hebben (we kunnen deze programmatisch maken of binden vanuit een weergave met findViewbyId (), enz ...)

Button btnOK = (...) 

Maak nu een anonieme klasse en stel deze inline.

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

De lay-out gebruiken om een klikactie te definiëren

Wanneer we een knop in de lay-out maken, kunnen we het kenmerk android:onClick om naar een methode in code te verwijzen om klikken te verwerken.

Knop

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

Maak vervolgens in uw activiteit de methode handleClick .

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

Dezelfde klikgebeurtenis gebruiken voor een of meer weergaven in de XML

Wanneer we een weergave in de lay-out maken, kunnen we het kenmerk android: onClick gebruiken om naar een methode in de bijbehorende activiteit of fragment te verwijzen om de klikgebeurtenissen af te handelen.

XML-indeling

<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" />

Activiteit / fragment code

Maak in uw code de methode die u noemde, waarbij v de weergave is die werd aangeraakt, en doe iets voor elke weergave die deze methode aanroept.

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

Als u wilt, kunt u ook voor elke weergave een andere methode gebruiken (in dit geval hoeft u natuurlijk niet op de ID te controleren).

Luisteren naar de lange klikgebeurtenissen

Om een lange klik te vangen en te gebruiken, moet u de juiste luisteraar-knop opgeven:

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

Externe luisteraar definiëren

Wanneer moet ik het gebruiken

  • Wanneer de code in een inline-luisteraar te groot is en uw methode / klasse lelijk en moeilijk leesbaar wordt
  • U wilt dezelfde actie uitvoeren in verschillende elementen (weergave) van uw app

Om dit te bereiken, moet u een klasse maken die een van de luisteraars in de View API implementeert.

Help bijvoorbeeld wanneer u lang op een element klikt:

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

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

Dan moet je gewoon een attribuut of variabele in je Activity om het te gebruiken:

HelpLongClickListener helpListener = new HelpLongClickListener(...);

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

OPMERKING: het definiëren van luisteraars in gescheiden klassen heeft één nadeel, het heeft geen rechtstreeks toegang tot klassenvelden, dus u moet gegevens (context, weergave) door constructor geven, tenzij u kenmerken openbaar maakt of geters definieert.

Aangepaste klik-luisteraar om meerdere snelle klikken te voorkomen

Om te voorkomen dat een knop binnen een korte tijd meerdere keren vuurt (laten we zeggen 2 klikken binnen 1 seconde, wat ernstige problemen kan veroorzaken als de flow niet wordt geregeld), kan een aangepaste SingleClickListener worden geïmplementeerd .

Deze ClickListener stelt een specifiek tijdsinterval in als drempel (bijvoorbeeld 1000ms).
Wanneer op de knop wordt geklikt, wordt een controle uitgevoerd om te zien of de trigger is uitgevoerd in de tijd die u hebt gedefinieerd, en zo niet, dan wordt deze geactiveerd.

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

}

En in deze klasse is de SingleClickListener gekoppeld aan de betreffende knop

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

Knopstijl aanpassen

Er zijn veel manieren om het uiterlijk van een knop aan te passen. Dit voorbeeld presenteert verschillende opties:


Optie 0: gebruik ThemeOverlay (momenteel de eenvoudigste / snelste manier)

Maak een nieuwe stijl in uw stijlbestand:

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>

Vervolgens in de lay-out waar u uw knop plaatst (bijv. 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>

Optie 1: maak uw eigen knopstijl

Maak in waarden / styles.xml een nieuwe stijl voor uw knop:

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>

Vervolgens in de lay-out waar u uw knop plaatst (bijvoorbeeld 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>

Optie 2: wijs een tekenteken toe voor elk van uw knopstatussen

Maak een XML-bestand in een map met de naam 'mybuttondrawable.xml' om de tekenbron van elk van uw knopstatussen te definiëren:

betekenbare / 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>

Elk van die drawables kunnen afbeeldingen zijn (bijv. Mybutton_disabled.png) of xml-bestanden die door u zijn gedefinieerd en opgeslagen in de map met drawables. Bijvoorbeeld:

betekenbare / 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>

Vervolgens in de lay-out waar u uw knop plaatst (bijv. 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>

Optie 3: voeg uw knopstijl toe aan uw app-thema

U kunt de standaard Android-knopstijl overschrijven in de definitie van uw app-thema (in waarden / stijlen.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>

Optie 4: Overlay een kleur op de standaardknopstijl programmatisch

Zoek gewoon uw knop in uw activiteit en pas een kleurenfilter toe:

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

U kunt verschillende overvloeimodi controleren hier en mooie voorbeelden hier .



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow