Tıklandığında Android'de Düğmenin Rengi Nasıl Değiştirilir?


82

Android Uygulaması üzerinde çalışıyorum. Ekranın altına yatay olarak yerleştirilecek 4 düğmenin olmasını istiyorum. Bu 4 düğmede 2 düğmenin üzerinde görüntü var. Düğmelerin kenarlıkları siyah renkte olmalı ve kenarlık mümkün olduğunca ince olmalıdır. Butona tıkladığımda bordür rengi değiştirilmeden butonun arka planının mavi renge dönmesini ve bir süre o renkte kalmasını istiyorum. Android'de bu senaryoya nasıl ulaşabilirim?


Yanıtlar:


129

Bir yaklaşım, bunun gibi bir XML dosyası oluşturmaktır, what.xml drawableadında:

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

bgaltve bgnormPNG resimleri çekilebilir.

Etkinliğinizde programlı olarak düğmeleri oluşturursanız, arka planı şu şekilde ayarlayabilirsiniz:

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

Düğmelerinizin stilini bir XML ile ayarlarsanız, şöyle bir şey yaparsınız:

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

Ve son olarak bir eğiticiye bağlantı . Bu yardımcı olur umarım.


16
Görüntüleri kullanmaktan kaçınmak istiyorsanız, XML dosyasındaki bu çekilebilir öğeleri renk tanımlarıyla da değiştirebilirsiniz.
haseman

7
@ jshin47 empik miktarda deneme yanılma. Şimdi Android geliştirme üzerine iki kitap yazdım :-)
haseman

@haseman - Bu 2 kitabın linklerini gönderebilir misiniz veya brk0018@gmail.com'da benimle paylaşabilir misiniz?
Bunlardan geçip

1
Ya sadece renkler görüntüler değilse?
Kala J

@KalaJ bir çözüm buldunuz mu?
Prafulla Kumar Sahu

75

Bu kodu "bg_button.xml" ile çekilebilir klasöre kaydedin ve xml'nizde düğmenin arka planı olarak "@ drawable / bg_button" ifadesini çağırın:

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

2
Teşekkürler dostum, stili kullanarak uygulama boyutunu küçültebilirsin.
çekmeceyi

Öte yandan, xml vektör tabanlı çekmeceler, özellikle eski cihazlarda, performans açısından genellikle görüntülerden daha kötüdür. Zamanından önce optimize etmeyin, ancak bunu da aklınızda bulundurun.
Przemyslaw Jablonski

10

Bunu dene

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

    });

9

Buna bakın,

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

2
Bu, KŞ'yi kalıcı olarak ayarlayacaktır, yani kullanıcı geri düğmesini tıklarsa arka plan kırmızı olacaktır.
methode

@methode: tamam, yeni yanıta başvurun, eski yanıtı düzelttim
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>

6

Düğmeye basıldığında arka plan görüntüsünü veya rengini değiştirmek istiyorsanız, bu kodu kopyalayın ve aşağıda açıklanan tam konuma projenize yapıştırın.

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

4

Bunu dene......

Önce button_pressed.xml adında bir xml dosyası oluşturun Bunlar içeriğidir.

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

Hayır, bunu düğmenizde deneyin.

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

button_pressed.xml çekilebilir klasörde olmalıdır. icon_1_press ve icon_1, düğmeye basmak ve normal odak için iki resimdir.


2

1-Düğme için 1 şekil oluştur Çekilebilir ve yeni çekilebilir kaynak dosyasına sağ tıklayın. Kök öğeyi şekillendirmek ve şeklinizi oluşturmak için değiştirin.

görüntü açıklamasını buraya girin

2-şimdi şeklinizden 1 kopya alın ve adını değiştirin ve düz rengi değiştirin. görüntü açıklamasını buraya girin

Çekilebilir ve yeni çekilebilir kaynak dosyasına 3-sağ tıklama, sadece kök öğeyi seçiciye ayarlayın.

dosyaya gidin ve "state_pressed" olarak ayarlayın

<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-son olarak xml düzenine gidin ve Düğme arka planınızı "seçiciniz" olarak ayarlayın

(zayıf ingilizcem için özür dilerim)


1

Bu kodu kullanıyorum (dalgalanma etkisiyle):

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

1

probleminizi çözmek için bu kodu deneyebilirsiniz

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

bu kodu çekilebilir dosyanıza yazın, yeni bir kaynak yapın ve istediğinizi adlandırın ve ardından bu drwable'ın adını, android'de image src'ye atıfta bulunduğumuz gibi düğmeye yazın.


1
merhaba efendim @ lmo Soruyla ilgili bazı açıklamalar yaptım.
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;

        }

lütfen bunu deneyin, bu kodda düğmedeki düğmenin arka planını değiştirmeye çalışıyorum, bu iyi çalışıyor.


0

Düğmenizin diğer renginizde ne kadar süre kalmasını istediğinizi doğru bir şekilde ele almak için bu sürümü tavsiye ederim:

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, düğmenin ne kadar süre sonra [ms] sıfırlanacağını belirtir (ancak, neyi elde etmek istediğinize bağlı olarak düğmenin arada kullanılmadığını kontrol etmek için biraz boole kullanmak isteyebilirsiniz ...) .


0

Yukarıdaki yorumlardan bazılarını kullanmak bile, gerekli olması gerektiğini hesaplamak çok daha uzun sürdü. Umarım bu örnek başka birine yardımcı olur.

Çekilebilir dizinde bir radio_button.xml oluşturun.

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

Daha sonra parçanın xml'sinde şunun gibi görünmelidir:

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

-1

hai en kolay yol şudur:

bu kodu mainactivity.java'ya ekleyin

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

ve sonra ana faaliyetinizde

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

veya bu öğreticiyi takip edin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.