Android
Przycisk
Szukaj…
Składnia
- <Przycisk ... />
- android: onClick = "nazwa metody"
- button.setOnClickListener (nowy OnClickListener () {...});
- klasa publiczna nazwa klasy implementuje View.OnLongClickListener
inline onClickListener
Powiedzmy, że mamy przycisk (możemy go utworzyć programowo lub powiązać z widoku za pomocą findViewbyId () itp.)
Button btnOK = (...)
Teraz utwórz anonimową klasę i ustaw ją w linii.
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do stuff here...
}
});
Użycie układu do zdefiniowania akcji kliknięcia
Kiedy tworzymy przycisk w układzie, możemy użyć atrybutu android:onClick
aby odwołać się do metody w kodzie obsługującej kliknięcia.
Przycisk
<Button
android:width="120dp"
android:height="wrap_content"
android:text="Click me"
android:onClick="handleClick" />
Następnie w swojej aktywności utwórz metodę handleClick
.
public void handleClick(View v) {
// Do whatever.
}
Korzystanie z tego samego zdarzenia kliknięcia dla jednego lub więcej widoków w pliku XML
Kiedy tworzymy dowolny widok w układzie, możemy użyć atrybutu android: onClick, aby odwołać się do metody w powiązanej aktywności lub fragmencie do obsługi zdarzeń kliknięcia.
Układ XML
<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" />
Kod aktywności / fragmentu
W kodzie utwórz nazwaną metodę, gdzie v będzie widokiem, który został dotknięty, i zrób coś dla każdego widoku, który wywołuje tę metodę.
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;
}
}
Jeśli chcesz, możesz również użyć innej metody dla każdego Widoku (w tym przypadku oczywiście nie musisz sprawdzać identyfikatora).
Słuchanie zdarzeń długiego kliknięcia
Aby złapać długie kliknięcie i użyć go, musisz podać odpowiedni przycisk nasłuchiwania:
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);
Definiowanie zewnętrznego nasłuchiwania
Kiedy powinienem go użyć?
- Gdy kod wewnątrz odbiornika wbudowanego jest zbyt duży, a twoja metoda / klasa staje się brzydka i trudna do odczytania
- Chcesz wykonać tę samą akcję w różnych elementach (widok) swojej aplikacji
Aby to osiągnąć, musisz utworzyć klasę implementującą jeden z detektorów w interfejsie API View .
Na przykład, pomóż, gdy długo klikniesz dowolny element:
public class HelpLongClickListener implements View.OnLongClickListener
{
public HelpLongClickListener() {
}
@Override
public void onLongClick(View v) {
// show help toast or popup
}
}
Następnie musisz mieć atrybut lub zmienną w swoim Activity
aby go użyć:
HelpLongClickListener helpListener = new HelpLongClickListener(...);
button1.setOnClickListener(helpListener);
button2.setOnClickListener(helpListener);
label.setOnClickListener(helpListener);
button1.setOnClickListener(helpListener);
UWAGA: zdefiniowanie detektorów w oddzielnej klasie ma jedną wadę: nie ma bezpośredniego dostępu do pól klasy, więc musisz przekazać dane (kontekst, widok) przez konstruktor, chyba że podasz atrybuty jako publiczne lub zdefiniujesz getery.
Odbiornik niestandardowych kliknięć, aby zapobiec wielu szybkim kliknięciom
Aby zapobiec wielokrotnemu uruchamianiu przycisku w krótkim czasie (powiedzmy 2 kliknięcia w ciągu 1 sekundy, co może powodować poważne problemy, jeśli przepływ nie jest kontrolowany), można zaimplementować niestandardowy SingleClickListener .
Ten ClickListener ustawia określony przedział czasu jako próg (na przykład 1000 ms).
Po kliknięciu przycisku zostanie uruchomione sprawdzenie, czy wyzwalacz został wykonany w zdefiniowanym czasie, a jeśli nie, to go wyzwoli.
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);
}
W klasie SingleClickListener jest powiązany z danym przyciskiem
myButton = (Button) findViewById(R.id.my_button);
myButton.setOnClickListener(new SingleClickListener() {
@Override
public void performClick(View view) {
// do stuff
}
});
Dostosowywanie stylu przycisku
Istnieje wiele możliwych sposobów dostosowania wyglądu przycisku. Ten przykład przedstawia kilka opcji:
Opcja 0: Użyj ThemeOverlay (obecnie najłatwiejszy / najszybszy sposób)
Utwórz nowy styl w pliku stylów:
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>
Następnie w układzie, w którym umieszczasz przycisk (np. 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>
Opcja 1: Utwórz własny styl przycisku
W wartości / styles.xml utwórz nowy styl dla przycisku:
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>
Następnie w układzie, w którym umieszczasz przycisk (np. W 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>
Opcja 2: Przypisywanie rysowania dla każdego stanu przycisku
Utwórz plik xml w folderze do rysowania o nazwie „mybuttondrawable.xml”, aby zdefiniować zasób do rysowania dla każdego z stanów przycisku:
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>
Każda z tych plików rysunkowych może być obrazami (np. Mybutton_disabled.png) lub plikami XML zdefiniowanymi przez Ciebie i przechowywanymi w folderze plików rysunkowych. Na przykład:
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>
Następnie w układzie, w którym umieszczasz przycisk (np. 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>
Opcja 3: Dodaj styl przycisku do motywu aplikacji
Możesz zastąpić domyślny styl przycisku Androida w definicji motywu aplikacji (w wartości / 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>
Opcja 4: programowo nałóż kolor na domyślny styl przycisku
Wystarczy znaleźć przycisk w swojej aktywności i zastosować filtr kolorów:
Button mybutton = (Button) findViewById(R.id.mybutton);
mybutton.getBackground().setColorFilter(anycolor, PorterDuff.Mode.MULTIPLY)
Możesz sprawdzić różne tryby mieszania tutaj i ładne przykłady tutaj .