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