Sök…


Syntax

  • <Knapp ... />
  • android: onClick = "method"
  • button.setOnClickListener (ny OnClickListener () {...});
  • public class klassnamn implementerar View.OnLongClickListener

inline onClickListener

Säg att vi har en knapp (vi kan skapa den programmatiskt, eller binda den från en vy med findViewbyId (), osv ...)

Button btnOK = (...) 

Skapa nu en anonym klass och ange den inline.

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

Använd layouten för att definiera en klickåtgärd

När vi skapar en knapp i layout kan vi använda android:onClick attributet för att referera till en metod i kod för att hantera klick.

Knapp

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

handleClick metoden handleClick i din aktivitet.

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

Använda samma klickhändelse för en eller flera vyer i XML

När vi skapar en vy i layout kan vi använda android: onClick-attributet för att referera till en metod i den tillhörande aktiviteten eller fragmentet för att hantera klickhändelserna.

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

Aktivitet / fragmentkod

Skapa i din kod den metod du namngivit, där v är den vy som rördes och gör något för varje vy som kallar den här metoden.

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

Om du vill kan du också använda olika metoder för varje vy (i detta fall behöver du naturligtvis inte kontrollera om det finns ID).

Lyssnar på händelserna med långa klick

För att fånga ett långt klick och använda det måste du tillhandahålla lämplig lyssnar på knappen:

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

Definiera extern lyssnare

När ska jag använda den

  • När koden i en inline lyssnare är för stor och din metod / klass blir ful och svår att läsa
  • Du vill utföra samma åtgärd i olika element (vy) i din app

För att uppnå detta måste du skapa en klass som implementerar en av lyssnarna i View API .

Ge till exempel hjälp när du länge klickar på något element:

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

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

Då behöver du bara ha ett attribut eller variabel i din Activity att använda det:

HelpLongClickListener helpListener = new HelpLongClickListener(...);

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

OBS! Att definiera lyssnare i åtskild klass har en nackdel, det kan inte komma åt klassfält direkt, så du måste skicka data (sammanhang, visa) genom konstruktören om du inte gör attribut offentliga eller definierar geters.

Anpassad klicklistare för att förhindra flera snabbklick

För att förhindra att en knapp avfyras flera gånger inom en kort tid (låt oss säga 2 klick inom 1 sekund, vilket kan orsaka allvarliga problem om flödet inte kontrolleras), kan man implementera en anpassad SingleClickListener .

Denna ClickListener anger ett specifikt tidsintervall som tröskel (till exempel 1000ms).
När du klickar på knappen körs en kontroll för att se om avtryckaren utfördes under den senaste tid du definierade och om inte kommer den att utlösa den.

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

}

Och i klassen är SingleClickListener kopplad till knappen som står på spel

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

Anpassa knappen stil

Det finns många möjliga sätt att anpassa utseendet på en knapp. Detta exempel visar flera alternativ:


Alternativ 0: Använd ThemeOverlay (för närvarande det enklaste / snabbaste sättet)

Skapa en ny stil i din stilfil:

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>

Sedan i layouten där du placerar din knapp (t.ex. 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>

Alternativ 1: Skapa din egen knappstil

Skapa en ny stil för din knapp i värden / styles.xml:

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>

Sedan i layouten där du placerar din knapp (t.ex. i 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>

Alternativ 2: Tilldela en dragbar för vart och ett av dina knapptillstånd

Skapa en xml-fil i en dragbar mapp som heter 'mybuttondrawable.xml' för att definiera den dragbara resursen för var och en av dina knapplägen:

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

Var och en av dessa drawables kan vara bilder (t.ex. mybutton_disabled.png) eller xml-filer som du definierar och lagras i mappen för drawables. Till exempel:

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

Sedan i layouten där du placerar din knapp (t.ex. 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>

Alternativ 3: Lägg till din knappstil i ditt apptema

Du kan åsidosätta standardknappstilen för Android i definitionen av ditt apptema (i värden / 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>

Alternativ 4: Överlägg en färg på standardknappstilen programmatiskt

Hitta bara knappen i din aktivitet och applicera ett färgfilter:

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

Du kan kontrollera olika blandningslägen här och fina exempel här .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow