web-dev-qa-db-ja.com

ボタン-クリック時に背景色を変更

アクティビティには8つのボタンがあります。私が探しているのは、ボタンにはデフォルトの背景があり、ボタンをクリックすると、背景色が他の色に変わるはずです。この部分は非常に単純です。しかし、他のボタンをクリックすると、最初のボタンの背景色がデフォルトの色に戻るはずです。これは「セレクターステート」を使用して行われることを理解していますが、実装方法についてはよくわかりません。私がそれについて読むほど、私はより混乱します。

現在、私が持っているxmlは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item Android:drawable="@color/blue" Android:state_pressed="true"/>
    <item Android:drawable="@color/dark_grey" Android:state_focused="true"/>  
    <item Android:drawable="@drawable/image_border"/>

 </selector>

xmlのdrawable/image_borderは、ボタンの形状を定義するために使用されます。以下はimage_border.xmlです

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <solid Android:color="@color/dark_grey" />

    <stroke
        Android:width="4dp"
        Android:color="@color/light_grey" />

    <padding
        Android:bottom="1dp"
        Android:left="1dp"
        Android:right="1dp"
        Android:top="1dp" />

</shape>

誰かが私が必要とする方法で動作するようにxmlを変更する方法で私を助けることができますか?

[編集1]

以下の回答はすべて、同様の種類のソリューションを指し示しています。私が行った変更は次のとおりです。しかし、それでも、ボタンを押すと、指定された色に変わりますが、すぐにデフォルトの色に戻ります。

button_background_blue.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item Android:drawable="@drawable/image_border_blue" Android:state_pressed="true"/>
    <item Android:drawable="@color/dark_grey" Android:state_focused="true"/>  
    <item Android:drawable="@drawable/image_border"/>

 </selector>

image_border_blue.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <solid Android:color="@color/blue" />

    <stroke
        Android:width="4dp"
        Android:color="@color/blue" />

    <padding
        Android:bottom="1dp"
        Android:left="1dp"
        Android:right="1dp"
        Android:top="1dp" />

</shape>

何かご意見は?

11
Vamsi Challa

次のように_button_pressed.xml_という名前の図形を作成します。

_<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <solid Android:color="@color/blue" />

    <stroke
        Android:width="4dp"
        Android:color="@color/blue" />

    <padding
        Android:bottom="1dp"
        Android:left="1dp"
        Android:right="1dp"
        Android:top="1dp" />

</shape>
_

次のように、idsが_R.id.btn_および_R.id.btn1_である牽引ボタンがあるとします...

_<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <Button
        Android:id="@+id/btn"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_margin="12dp"
        Android:background="@drawable/button_pressed"
        Android:onClick="onClick"
        Android:text="Press Me 1" />

    <Button
        Android:id="@+id/btn2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_margin="12dp"
        Android:background="@drawable/button_pressed"
        Android:onClick="onClick"
        Android:text="Press Me 2" />

</LinearLayout>
_

次のようにonClick()メソッドを記述します...これにより、変更された色を別のボタンが押されるまで保持できます。

_Button button;

public void onClick(View v) {

    Drawable dr = getResources().getDrawable(R.drawable.button_pressed);
    dr.setColorFilter(Color.parseColor("#FF0000"), PorterDuff.Mode.SRC_ATOP);

    switch (v.getId()) {
    case R.id.btn:

        if (button == null) {
            button = (Button) findViewById(v.getId());
        } else {
            button.setBackgroundResource(R.drawable.button_pressed);
            button = (Button) findViewById(v.getId());
        }
        button.setBackgroundDrawable(dr);

        break;

    case R.id.btn2:
        if (button == null) {
            button = (Button) findViewById(v.getId());
        } else {
            button.setBackgroundResource(R.drawable.button_pressed);
            button = (Button) findViewById(v.getId());
        }
        button.setBackgroundDrawable(dr);

        break;

    default:
        break;
    }
}
_

今、あなたはあなたがやりたいことを手に入れると思います。

8
Hamid Shatu

このセレクターを使用して描画可能なフォルダーに配置し、ボタンの背景をこのセレクターに設定します。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item Android:drawable="@color/blue" Android:state_pressed="true"/>
<item Android:drawable="@color/AliceBlue" Android:state_focused="true"/>  
<item Android:drawable="@color/Azure"/>

 </selector>

[〜#〜] or [〜#〜]背景の代わりに色を使用できます。それが役に立てば幸い。

14
i.n.e.f

このセレクターをお勧めします。

Drawableフォルダーに単純なselector.xmlファイルを作成し、ボタンに_Android:background="@drawable/selector"_またはyourButton.setBackground(getResources().getDrawable(R.drawable.selector));のようなコードでセレクターを追加するだけです。

_selector.xml_:

_<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_enabled="true"
        Android:state_pressed="true" Android:drawable="@Android:color/holo_blue_light" />
    <item Android:state_enabled="true"
        Android:state_focused="true" Android:drawable="@Android:color/holo_green_dark" />
    <item Android:state_enabled="true"
        Android:state_selected="true" Android:drawable="@Android:color/holo_purple" />
    <item
        Android:drawable="@drawable/yourdrawable" />
</selector>
_

最初の項目はpressed用、2番目はfocused用、最後はselected状態用です。

8

androidでそれぞれの色ボタンがクリックされたときにレイアウトの背景色を変更する

main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="#b056ff"
    Android:id="@+id/l1">
    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:id="@+id/b1"
        Android:layout_gravity="center"
        Android:text="RED"/>
    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:id="@+id/b2"
        Android:layout_gravity="center"
        Android:text="GREEN" />
    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:id="@+id/b3"
        Android:layout_gravity="center"
        Android:text="BLUE"/>

MyActivity.Java

package ram.Android.com.cwp1;

import Android.app.Activity;
import Android.graphics.Color;
import Android.net.Uri;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.Button;
import Android.widget.LinearLayout;

import com.google.Android.gms.appindexing.Action;
import com.google.Android.gms.appindexing.AppIndex;
import com.google.Android.gms.common.api.GoogleApiClient;

/**
 * Created by VENKATESH on 10-Jun-16.
 */
public class MyActivity extends Activity implements View.OnClickListener {
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    Button r, g, b;
    LinearLayout ll;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        ll = (LinearLayout) findViewById(R.id.l1);
        r = (Button) findViewById(R.id.b1);
        g = (Button) findViewById(R.id.b2);
        b = (Button) findViewById(R.id.b3);
        r.setOnClickListener(this);
        g.setOnClickListener(this);
        b.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.b1:
                ll.setBackgroundColor(Color.RED);
                break;

            case R.id.b2:
                ll.setBackgroundColor(Color.GREEN);
                break;
            case R.id.b3:
                ll.setBackgroundColor(Color.BLUE);
                break;

        }

    }
}
1
Ramakrishna

私はそれが非常に遅いことを知っていますが、誰かが役に立つことを願っています。私は非常にシンプルなソリューションを持っています、私は自分のアプリで使用し、素晴らしい作品を作りました。

ロジックを説明しましょう。1。2つのボタンのクリックを追跡します-前のボタンがクリックされ、現在のボタンがクリックされました。 ArrayList 2を使用しています。ボタンのクリックごとに、ArrayListの以前および現在のボタンクリック値を更新し続けます。 3.クリックした前のボタンの背景色を変更します。 4.クリックした現在のボタンの背景色を変更します。

論理がシンプルで簡単であることを願っています。

これが実装です

xml

<Button
            Android:onClick="onClickRosterDay"
            Android:text="Mon"
            Android:textColor="@color/textColorWhite"
            Android:background="@color/colorAccent"
            Android:id="@+id/rosterMonday"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content" />

onClickメソッドは、XMLのすべてのボタンに対して定義されます。例では、onClickRosterDayです。

Java

 //buttons 

    Button rosterMonday;
    Button rosterTuesday;
    Button rosterWednesday;
    Button rosterThursday;
    Button rosterFriday;
    Button rosterSaturday;

    //ArrayList to track button clicks
    private ArrayList<Button> buttonClickedDay;

    in OnCreate

    buttonClickedDay = new ArrayList<>();
    // to start with these are the default clicks. 
    buttonClickedDay.add(rosterMonday ); //previous button clicked
    buttonClickedDay.add(rosterMonday ); // current button clicked



    public void onClickRosterDay(View v) {
            switch (v.getId()){
                case R.id.rosterMonday:
                    daySelected = "MONDAY";
                    // move current click button to previous button clicked position
                    buttonClickedDay.set(0, buttonClickedDay.get(1)); 
                    // update current clicked position
                    buttonClickedDay.set(1,rosterMonday);
                    break;

                case R.id.rosterTuesday:
                    daySelected = "TUESDAY";
                    buttonClickedDay.set(0, buttonClickedDay.get(1));
                    buttonClickedDay.set(1,rosterTuesday);
                    break;

                case R.id.rosterWednesday:
                    daySelected = "WEDNESDAY";
                    buttonClickedDay.set(0, buttonClickedDay.get(1));
                    buttonClickedDay.set(1,rosterWednesday);
                    break;

                case R.id.rosterThursday:
                    daySelected = "THURSDAY";
                    buttonClickedDay.set(0, buttonClickedDay.get(1));
                    buttonClickedDay.set(1,rosterThursday);
                    break;

                case R.id.rosterFriday:
                    daySelected = "FRIDAY";
                    buttonClickedDay.set(0, buttonClickedDay.get(1));
                    buttonClickedDay.set(1,rosterFriday);
                    break;

                case R.id.rosterSaturday:
                    daySelected = "SATURDAY";
                    buttonClickedDay.set(0, buttonClickedDay.get(1));
                    buttonClickedDay.set(1,rosterSaturday);
                    break;
            }





        if(buttonClickedDay.get(0) != buttonClickedDay.get(1)) {
            // update background color of  previous button clicked    
buttonClickedDay.get(0).setBackgroundColor(this.getResources().getColor(R.color.colorAccent));
            // update background color of  current button clicked      
buttonClickedDay.get(1).setBackgroundColor(this.getResources().getColor(R.color.textBackgroundGreen));
        }
    }
0
tanni tanna