Jak zmienić kolor przycisku w systemie Android po kliknięciu?

82

Pracuję nad aplikacją na Androida. Chcę mieć 4 przyciski do umieszczenia poziomo u dołu ekranu. W tych 4 przyciskach 2 przyciski mają na sobie obrazy. Obramowanie przycisków powinno być czarne, a krawędź powinna być jak najcieńsza. Po kliknięciu przycisku chcę, aby tło przycisku zmieniło się na kolor niebieski bez zmiany koloru obramowania i powinno pozostać w tym kolorze przez jakiś czas. Jak mogę osiągnąć ten scenariusz w systemie Android?

Android_programmer_camera
źródło
Możliwy duplikat Jak zmienić kolor ścieżki do rysowania wektorów po kliknięciu przycisku Oznaczyłem ją jako duplikat, możesz sprawdzić moją odpowiedź tutaj: stackoverflow.com/a/55205149/3763032
mochadwi

Odpowiedzi:

129

Jednym ze sposobów jest utworzenie pliku XML takiego jak ten w programie o drawablenazwie cokolwiek.xml:

<?xml version="1.0" encoding="utf-8"?> 
  <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_focused="true"
        android:state_pressed="true"
        android:drawable="@drawable/bgalt" />

    <item
        android:state_focused="false"
        android:state_pressed="true"
        android:drawable="@drawable/bgalt" />

    <item android:drawable="@drawable/bgnorm" />
</selector>

bgalti bgnormsą obrazami PNG do rysowania.

Jeśli utworzysz przyciski programowo w swoim działaniu, możesz ustawić tło za pomocą:

final Button b = new Button (MyClass.this);
b.setBackgroundDrawable(getResources().getDrawable(R.drawable.whatever));

Jeśli ustawisz styl przycisków za pomocą XML, zrobisz coś takiego:

<Button
  android:id="@+id/mybutton"
  android:background="@drawable/watever" />

I na koniec link do samouczka . Mam nadzieję że to pomoże.

metoda
źródło
16
Możesz również zastąpić te rysunki w pliku XML definicjami kolorów, jeśli chcesz uniknąć używania obrazów.
haseman
7
@ jshin47 empic ilość prób i błędów. Napisałem teraz dwie książki o rozwoju Androida :-)
haseman
@haseman - Czy możesz opublikować linki do tych 2 książek lub udostępnić mi je pod adresem [email protected].
Byłbym szczęśliwy, gdybyśmy
1
A co, jeśli tylko kolory, a nie obrazy?
Kala J,
@KalaJ znalazłeś rozwiązanie?
Prafulla Kumar Sahu
75

Zapisz ten kod w folderze do rysowania z „bg_button.xml” i wywołaj „@ drawable / bg_button” jako tło przycisku w swoim xml:

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#004F81" />
            <stroke
                android:width="1dp"
                android:color="#222222" />
            <corners
                android:radius="7dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#89cbee"
                android:endColor="#004F81"
                android:angle="270" />
            <stroke
                android:width="1dp"
                android:color="#4aa5d4" />
            <corners
                android:radius="7dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>
Faakhir
źródło
2
Dzięki stary, stylem możesz zmniejszyć rozmiar aplikacji. dobry pomysł, aby nie używać do rysowania
Rahul Mandaliya,
Z drugiej strony, rysunki XML oparte na wektorach są zwykle gorsze pod względem wydajności niż obrazy, szczególnie na starszych urządzeniach. Nie optymalizuj przedwcześnie, ale miej to również na uwadze.
Przemysław Jabłoński
10

Spróbuj tego

    final Button button = (Button) findViewById(R.id.button_id);
    button.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View view, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP) {
                button.setBackgroundColor(Color.RED);
            } else if(event.getAction() == MotionEvent.ACTION_DOWN) {
                button.setBackgroundColor(Color.BLUE);
            }
            return false;
        }

    });
Waxren
źródło
9

Odnieś to,

boolean check = false;
Button backward_img;
Button backward_img1;
backward_img = (Button) findViewById(R.id.bars_footer_backward);
backward_img1 = (Button) findViewById(R.id.bars_footer_backward1);
backward_img.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        check = true;
        backward_img.setBackgroundColor(Color.BLUE);
    }
});

if (check == true) {
    backward_img1.setBackgroundColor(Color.RED);
    backward_img.setBackgroundColor(Color.BLUE);
}
Sankar Ganesh PMP
źródło
2
Spowoduje to trwałe ustawienie BG, to znaczy, jeśli użytkownik kliknie przycisk Wstecz, tło będzie czerwone.
metoda
@methode: ok, odnieś się do nowej odpowiedzi Poprawiłem oldanswer
Sankar Ganesh PMP
8
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- default -->
    <item
        android:state_pressed="false"
        android:state_focused="false">
        <shape
            android:innerRadiusRatio="1"
            android:shape="rectangle" >
            <solid android:color="#00a3e2" />

            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp" />

        </shape>
    </item>

    <!-- button focused -->
    <item
        android:state_pressed="false"
        android:state_focused="true">
        <shape
            android:innerRadiusRatio="1"
            android:shape="rectangle" >
            <solid android:color="#5a97f5" />

            <padding
                android:bottom="5dp"
                android:left="10dp"
                android:right="10dp"
                android:top="5dp" />
        </shape></item>

    <!-- button pressed -->
    <item
        android:state_pressed="true"
        android:state_focused="false">
        <shape
            android:innerRadiusRatio="1"
            android:shape="rectangle" >
            <solid android:color="#478df9"/>
            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp" />
        </shape></item>
</selector>
سیدرسول میرعظیمی
źródło
6

Jeśli chcesz zmienić obraz backgorund lub kolor przycisku po jego naciśnięciu, po prostu skopiuj ten kod i wklej w swoim projekcie dokładnie w miejscu opisanym poniżej.

      <!-- Create new xml file like mybtn_layout.xml file in drawable -->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/pressed" /> <!--pressed --> 
<item android:drawable="@drawable/normal" /> <!-- Normal -->
</selector>
  <!-- Now this file should be in a drawable folder and use this 
  single line code in    button code to get all the properties of this xml file -->

    <Button
      android:id="@+id/street_btn"
      android:layout_width="wrap_content"
      android:background="@drawable/layout_a" > <!-- your required code -->
    </Button>
Pir Fahim Shah
źródło
4

Spróbuj tego......

Najpierw utwórz plik xml o nazwie button_pressed.xml. Oto jego zawartość.

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" 
          android:state_pressed="false" 
          android:drawable="@drawable/icon_1" />
    <item android:state_focused="true" 
          android:state_pressed="true"
          android:drawable="@drawable/icon_1_press" />
    <item android:state_focused="false" 
          android:state_pressed="true"
            android:drawable="@drawable/icon_1_press" />
    <item android:drawable="@drawable/icon_1" />
</selector>

Noe, spróbuj tego na swoim przycisku.

int imgID = getResources().getIdentifier("button_pressed", "drawable", getApplication().getPackageName());
button.setImageResource(imgID);

button_pressed.xml powinien znajdować się w folderze do rysowania. icon_1_press i icon_1 to dwa obrazy po naciśnięciu przycisku i normalnym ustawieniu ostrości.

James
źródło
2

1-utwórz 1 kształt dla przycisku Kliknij prawym przyciskiem myszy na rysowalny i nowy plik zasobów do rysowania. zmień element główny na kształt i utwórz swój kształt.

wprowadź opis obrazu tutaj

2-teraz wykonaj 1 kopię ze swojego kształtu i zmień nazwę oraz zmień jednolity kolor. wprowadź opis obrazu tutaj

Kliknij prawym przyciskiem myszy plik zasobów do rysowania i nowy, który można rysować, po prostu ustaw element główny na selektor.

przejdź do pliku i ustaw „state_pressed”

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true"android:drawable="@drawable/YourShape1"/>
<item android:state_pressed="false" android:drawable="@drawable/YourShape2"/>

</selector>

4-koniec przejdź do układu XML i ustaw tło przycisku na „swój selektor”

(przepraszam za mój słaby angielski)

Mj.talebi
źródło
1

Używam tego kodu (z efektem tętnienia):

<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/color_gray">
<item android:id="@android:id/mask">
    <color android:color="@color/color_gray" />
</item></ripple>
user3524157
źródło
1

możesz wypróbować ten kod, aby rozwiązać problem

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true"
   android:drawable="@drawable/login_selected" /> <!-- pressed -->
  <item android:state_focused="true"
   android:drawable="@drawable/login_mouse_over" /> <!-- focused -->
  <item android:drawable="@drawable/login" /> <!-- default -->
</selector>

napisz ten kod w swoim drawable stwórz nowy zasób i nazwij go tak, jak chcesz, a następnie wpisz nazwę tego drible w przycisku tak samo, jak odnosimy się do image src w Android

Mudassir Khan
źródło
1
cześć panie @lmo Podałem pewne wyjaśnienie w pytaniu.
Mudassir Khan
1
public void onPressed(Button button, int drawable) {
            if (!isPressed) {
                button.setBackgroundResource(R.drawable.bg_circle);
                isPressed = true;
            } else {
                button.setBackgroundResource(drawable);
                isPressed = false;
            }
        }


    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.circle1:
                onPressed(circle1, R.drawable.bg_circle_gradient);
                break;
            case R.id.circle2:
                onPressed(circle2, R.drawable.bg_circle2_gradient);
                break;
            case R.id.circle3:
                onPressed(circle3, R.drawable.bg_circle_gradient3);
                break;
            case R.id.circle4:
                onPressed(circle4, R.drawable.bg_circle4_gradient);
                break;
            case R.id.circle5:
                onPressed(circle5, R.drawable.bg_circle5_gradient);
                break;
            case R.id.circle6:
                onPressed(circle6, R.drawable.bg_circle_gradient);
                break;
            case R.id.circle7:
                onPressed(circle7, R.drawable.bg_circle4_gradient);
                break;

        }

spróbuj tego, w tym kodzie próbuję zmienić tło przycisku po kliknięciu przycisku to działa dobrze.

Abhishek Rana
źródło
0

Aby prawidłowo radzić sobie przez jak długo chcesz, aby twój przycisk pozostawał w innym kolorze, radziłbym tę wersję:

button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        button.setBackground(getResources().getDrawable(R.drawable.on_click_drawable));
                        break;
                    case MotionEvent.ACTION_UP:
                        new java.util.Timer().schedule(
                                new java.util.TimerTask() {
                                    @Override
                                    public void run() {
                                        ((Activity) (getContext())).runOnUiThread(new Runnable() {
                                            @Override
                                            public void run() {
                                                button.setBackground(getResources().getDrawable(R.drawable.not_clicked_drawable));
                                            }
                                        });
                                    }
                                }, BUTTON_CLICK_TIME_AFTER_RELEASE_ANIMATION);
                        break;
                    default:
                }
                return false;
            }
        });

BUTTON_CLICK_TIME_AFTER_RELEASE_ANIMATION wskazuje, po jakim czasie [ms] przycisk zresetuje się do poprzedniego stanu (jednak możesz użyć wartości logicznej, aby sprawdzić, czy przycisk nie został użyty w międzyczasie, w zależności od tego, co chcesz osiągnąć ...) .

Nicolas Zimmermann
źródło
0

Nawet użycie niektórych z powyższych komentarzy zajęło więcej czasu, zanim okazało się, że powinno to być konieczne. Mam nadzieję, że ten przykład pomoże komuś innemu.

Utwórz radio_button.xml w katalogu do rysowania.

    <?xml version="1.0" encoding="utf-8"?>

<!-- An element which allows two drawable items to be listed.-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@drawable/radio_button_checked" /> <!--pressed -->
    <item android:drawable="@drawable/radio_button_unchecked" /> <!-- Normal -->
</selector>

Wtedy w xml dla fragmentu powinno wyglądać mniej więcej tak

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
<RadioGroup
android:layout_width="match_parent"
android:layout_height="match_parent">

<RadioButton

    android:id="@+id/radioButton1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:layout_weight="1"
    android:button="@drawable/radio_button"
    android:paddingLeft="10dp" />        
<RadioButton
    android:id="@+id/radioButton2"
    android:layout_marginLeft="10dp"
    android:paddingLeft="10dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:button="@drawable/radio_button" />

</RadioGroup>
    </LinearLayout>
</layout>
iCyberPaul
źródło
-1

hai najłatwiej jest to:

dodaj ten kod do mainactivity.java

public void start(View view) {

  stop.setBackgroundResource(R.color.red);
 start.setBackgroundResource(R.color.yellow);
}

public void stop(View view) {
stop.setBackgroundResource(R.color.yellow);
start.setBackgroundResource(R.color.red);
}

a następnie w Twojej działalności main

    <button android:id="@+id/start" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="start" android:text="Click">

</button><button android:id="@+id/stop" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="stop" android:text="Click">

lub postępuj zgodnie z tym samouczkiem

dondondon
źródło