アクティビティには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>
何かご意見は?
次のように_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>
_
次のように、id
sが_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;
}
}
_
今、あなたはあなたがやりたいことを手に入れると思います。
このセレクターを使用して描画可能なフォルダーに配置し、ボタンの背景をこのセレクターに設定します。
<?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 [〜#〜]背景の代わりに色を使用できます。それが役に立てば幸い。
このセレクターをお勧めします。
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
状態用です。
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。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));
}
}