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