Android 如何以编程方式设置按钮行程和半径
Android how to programmatically set Button stroke and radius
我有这个 activity 和 48 Button
用户可以触摸并更改文本和背景颜色。
默认Buttons
的样式我是这样编辑的
但是当用户更改背景颜色时我得到了这个糟糕的结果
这些 xml 设置了默认 Buttons
的样式
buttons.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_pressed"
android:state_pressed="true" />
<item android:drawable="@drawable/button_focused"
android:state_focused="true" />
<item android:drawable="@drawable/button_default" />
</selector>
button_default.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
android:radius="100dp"
/>
<solid
android:color="#FFFFFF"
/>
<padding
android:left="0dp"
android:top="0dp"
android:right="0dp"
android:bottom="0dp"
/>
<stroke
android:width="3dp"
android:color="#787878"
/>
</shape>
在另一个 xml 中只改变颜色所以我避免 post 它们。
这是以编程方式更改 Button
的代码。
我从 DB
中获取所有更改 Button
并用 ID
保存并设置 Button
.
的颜色
//Get all materie inside database
List<Materia> materia = db.getAllMaterie();
//change all TextView inputed from user
if(materia.isEmpty()){
//do nothing
}else {
for (Materia mat : materia) {
//Change all the Button with values stored inside the database
int resId = getResources().getIdentifier(mat.getID(), "id", getPackageName());
final Button changedButton = (Button) findViewById(resId);
changedButton.setText(mat.getMateria());
changedButton.setTypeface(null, Typeface.BOLD);
changedButton.setBackgroundColor(mat.getColor());
}
}
但是我失去了半径和笔画属性。
有什么方法可以以编程方式设置它们?
采纳其他建议!
为此,您应该以编程方式设置可绘制对象。
Drawable buttonDrawable = context.getResources().getDrawable(R.drawable.buttons.xml);
buttonDrawable.mutate()
changedButton.setBackgroundDrawable(buttonDrawable);
我用这行代码解决了问题
changedButton.getBackground().setColorFilter(mat.getColor(), PorterDuff.Mode.MULTIPLY);
而不是
changedButton.setBackgroundColor(mat.getColor());
我用 getBackground()
取回默认 Button
的背景,然后用 setColorFilter(int, mode);
设置颜色
所以结果变成
//Get all materie inside database
List<Materia> materia = db.getAllMaterie();
//change all TextView inputed from user
if(materia.isEmpty()){
//do nothing
}else {
for (Materia mat : materia) {
//Change all the Button with values stored inside the database
int resId = getResources().getIdentifier(mat.getID(), "id", getPackageName());
final Button changedButton = (Button) findViewById(resId);
changedButton.setText(mat.getMateria());
changedButton.setTypeface(null, Typeface.BOLD);
changedButton.getBackground().setColorFilter(mat.getColor(), PorterDuff.Mode.MULTIPLY);
}
}
我有这个 activity 和 48 Button
用户可以触摸并更改文本和背景颜色。
默认Buttons
的样式我是这样编辑的
但是当用户更改背景颜色时我得到了这个糟糕的结果
这些 xml 设置了默认 Buttons
buttons.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_pressed"
android:state_pressed="true" />
<item android:drawable="@drawable/button_focused"
android:state_focused="true" />
<item android:drawable="@drawable/button_default" />
</selector>
button_default.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
android:radius="100dp"
/>
<solid
android:color="#FFFFFF"
/>
<padding
android:left="0dp"
android:top="0dp"
android:right="0dp"
android:bottom="0dp"
/>
<stroke
android:width="3dp"
android:color="#787878"
/>
</shape>
在另一个 xml 中只改变颜色所以我避免 post 它们。
这是以编程方式更改 Button
的代码。
我从 DB
中获取所有更改 Button
并用 ID
保存并设置 Button
.
//Get all materie inside database
List<Materia> materia = db.getAllMaterie();
//change all TextView inputed from user
if(materia.isEmpty()){
//do nothing
}else {
for (Materia mat : materia) {
//Change all the Button with values stored inside the database
int resId = getResources().getIdentifier(mat.getID(), "id", getPackageName());
final Button changedButton = (Button) findViewById(resId);
changedButton.setText(mat.getMateria());
changedButton.setTypeface(null, Typeface.BOLD);
changedButton.setBackgroundColor(mat.getColor());
}
}
但是我失去了半径和笔画属性。 有什么方法可以以编程方式设置它们? 采纳其他建议!
为此,您应该以编程方式设置可绘制对象。
Drawable buttonDrawable = context.getResources().getDrawable(R.drawable.buttons.xml);
buttonDrawable.mutate()
changedButton.setBackgroundDrawable(buttonDrawable);
我用这行代码解决了问题
changedButton.getBackground().setColorFilter(mat.getColor(), PorterDuff.Mode.MULTIPLY);
而不是
changedButton.setBackgroundColor(mat.getColor());
我用 getBackground()
取回默认 Button
的背景,然后用 setColorFilter(int, mode);
所以结果变成
//Get all materie inside database
List<Materia> materia = db.getAllMaterie();
//change all TextView inputed from user
if(materia.isEmpty()){
//do nothing
}else {
for (Materia mat : materia) {
//Change all the Button with values stored inside the database
int resId = getResources().getIdentifier(mat.getID(), "id", getPackageName());
final Button changedButton = (Button) findViewById(resId);
changedButton.setText(mat.getMateria());
changedButton.setTypeface(null, Typeface.BOLD);
changedButton.getBackground().setColorFilter(mat.getColor(), PorterDuff.Mode.MULTIPLY);
}
}