Wie ändere ich die Farbe der Schaltfläche in Android, wenn ich darauf klicke?

81

Ich arbeite an einer Android-Anwendung. Ich möchte 4 Schaltflächen haben, die horizontal am unteren Bildschirmrand platziert werden sollen. In diesen 4 Tasten haben 2 Tasten Bilder. Der Rand der Schaltflächen sollte schwarz und der Rand so dünn wie möglich sein. Wenn ich auf die Schaltfläche klicke, soll der Hintergrund der Schaltfläche in blaue Farbe geändert werden, ohne dass die Farbe des Rahmens geändert wird, und einige Zeit in dieser Farbe bleiben. Wie kann ich dieses Szenario in Android erreichen?

Android_programmer_camera
quelle
Mögliches Duplikat von So ändern Sie die Farbe des Vektor-Zeichnungspfads beim Klicken auf die Schaltfläche Ich habe es als Duplikat markiert. Sie können meine Antwort hier überprüfen: stackoverflow.com/a/55205149/3763032
mochadwi

Antworten:

127

Ein Ansatz besteht darin, eine XML-Datei wie diese drawablemit dem Namen Whatever.xml zu erstellen :

<?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>

bgaltund bgnormsind PNG-Bilder in zeichnbar.

Wenn Sie die Schaltflächen in Ihrer Aktivität programmgesteuert erstellen, können Sie den Hintergrund wie folgt festlegen:

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

Wenn Sie den Stil Ihrer Schaltflächen mit einem XML festlegen, würden Sie Folgendes tun:

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

Und zum Schluss noch ein Link zu einem Tutorial . Hoffe das hilft.

Methode
quelle
16
Sie können diese Zeichen in der XML-Datei auch durch Farbdefinitionen ersetzen, wenn Sie die Verwendung von Bildern vermeiden möchten.
Haseman
7
@ jshin47 eine Menge Versuch und Irrtum. Ich habe jetzt zwei Bücher über Android-Entwicklung geschrieben :-)
Haseman
@haseman - Können Sie die Links dieser beiden Bücher posten oder an [email protected] senden? Würde mich freuen, diese
durchzugehen
1
Was ist, wenn nur Farben keine Bilder sind?
Kala J
@KalaJ hast du eine Lösung gefunden?
Prafulla Kumar Sahu
74

Speichern Sie diesen Code in einem Zeichenordner mit "bg_button.xml" und rufen Sie "@ drawable / bg_button" als Hintergrund der Schaltfläche in Ihrer XML auf:

<?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
quelle
2
Vielen Dank, Mann, mit Stil können Sie die Anwendungsgröße reduzieren. gute Idee, nicht zeichnbar zu verwenden
Rahul Mandaliya
Auf der anderen Seite sind auf XML-Vektoren basierende Drawables in der Regel schlechter als Bilder, insbesondere auf älteren Geräten. Optimieren Sie nicht vorzeitig, aber denken Sie auch daran.
Przemyslaw Jablonski
9

Verweisen Sie darauf,

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
quelle
2
Dadurch wird der Hintergrund dauerhaft festgelegt. Wenn der Benutzer auf die Schaltfläche "Zurück" klickt, wird der Hintergrund rot angezeigt.
Methode
@methode: ok verweise auf die neue Antwort Ich habe die alte Antwort korrigiert
Sankar Ganesh
8

Versuche dies

    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
quelle
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>
سیدرسول میرعظیمی
quelle
6

Wenn Sie das Hintergrundbild oder die Farbe der Schaltfläche beim Drücken ändern möchten, kopieren Sie einfach diesen Code und fügen Sie ihn an der unten beschriebenen Stelle in Ihr Projekt ein.

      <!-- 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
quelle
4

Versuche dies......

Erstellen Sie zuerst eine XML-Datei mit dem Namen button_pressed.xml. Dies ist der Inhalt.

<?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>

Nein, versuchen Sie dies auf Ihrem Knopf.

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

button_pressed.xml sollte sich im Zeichenordner befinden. icon_1_press und icon_1 sind zwei Bilder für Tastendruck und normalen Fokus.

James
quelle
1

Ich benutze diesen Code (mit Ripple-Effekt):

<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
quelle
1

Sie können diesen Code ausprobieren, um Ihr Problem zu lösen

<?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>

Schreiben Sie diesen Code in Ihr Drawable. Erstellen Sie eine neue Ressource und benennen Sie sie nach Ihren Wünschen. Schreiben Sie dann den Namen dieses Drwables in die Schaltfläche, wie wir es in Android für Bild-src bezeichnen

Mudassir Khan
quelle
1
hi sir @lmo Ich habe mit der Frage eine Erklärung gegeben.
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;

        }

Bitte versuchen Sie dies, in diesem Code versuche ich, den Hintergrund der Schaltfläche auf Schaltfläche zu ändern. Klicken Sie auf diese Funktion.

Abhishek Rana
quelle
1

1-make 1 Form für Button Klicken Sie mit der rechten Maustaste auf zeichnbare und neue zeichnbare Ressourcendatei. Ändern Sie das Wurzelelement in Form und machen Sie Ihre Form.

Geben Sie hier die Bildbeschreibung ein

2-Jetzt mache 1 Kopie von deiner Form und ändere den Namen und die Volltonfarbe. Geben Sie hier die Bildbeschreibung ein

3 Klicken Sie mit der rechten Maustaste auf eine zeichnbare und eine neue zeichnbare Ressourcendatei. Setzen Sie einfach das Stammelement auf Selektor.

gehe zur Datei und setze "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-das Ende gehen Sie zum XML-Layout und setzen Sie Ihren Button-Hintergrund "Ihre Auswahl"

(Entschuldigung für mein schwaches Englisch)

Mj.talebi
quelle
0

Um richtig damit umzugehen, wie lange Ihr Knopf in Ihrer anderen Farbe bleiben soll, würde ich diese Version empfehlen:

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 gibt an, nach wie viel Zeit [ms] die Schaltfläche auf den vorherigen Status zurückgesetzt wird (Sie können jedoch einen Booleschen Wert verwenden, um zu überprüfen, ob die Schaltfläche dazwischen nicht verwendet wurde, je nachdem, was Sie erreichen möchten ...). .

Nicolas Zimmermann
quelle
0

Selbst wenn einige der obigen Kommentare verwendet wurden, dauerte es viel länger, um herauszufinden, was notwendig sein sollte. Hoffentlich hilft dieses Beispiel jemand anderem.

Erstellen Sie eine radio_button.xml im Zeichenverzeichnis.

    <?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>

Dann sollte in der XML für das Fragment so etwas aussehen

<?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
quelle
-1

Der einfachste Weg ist folgender:

Fügen Sie diesen Code zu mainactivity.java hinzu

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

und dann in Ihrer Aktivität 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">

oder folgen Sie diesem Tutorial

Dondondon
quelle