下面的代码在单击时将按钮的背景颜色从绿色更改为红色,其中bgColor的相应MvxColor在我的StartStopCommand中定义。它可以工作,但MvxBind BackgroundColor会覆盖Button的形状。
有没有办法在Android中保持这种形状,只改变颜色,使其不需要特定于平台的代码(如下所示)?
Android中的按钮:
<Button
android:text="Start"
android:textColor="#FFFFFF"
android:textSize="30sp"
android:layout_margin="5dip"
android:layout_width="270dp"
android:layout_height="wrap_content"
android:background="@drawable/buttonshape"
local:MvxBind="Click StartStopCommand; BackgroundColor bgColor, Converter=NativeColor" />
形状xml是:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
android:radius="10dp"
/>
<solid
android:color="#3497db"
/>
<size
android:width="270dp"
android:height="60dp"
/>
</shape>
答案 0 :(得分:2)
由于您为按钮设置了Background
资源,因此稍后使用BackgroundColor
会丢弃您在此处设置的所有内容。
您可能想要的是Selector
资源的Background
,它确定Button
正常,有针对性,有效以及您想要响应的其他任何状态时设置的内容。这是一个非常特定于平台的事情,您可能无法在其他平台上重用该行为。
反正。你可以尝试这样的事情:
<强> shape_selected.xml:强>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="10dp" />
<solid android:color="#dddddd" /> <!-- use selected color here -->
<size
android:width="270dp"
android:height="60dp"/>
</shape>
<强> shape_unselected.xml:强>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="10dp" />
<solid android:color="#3497db" />
<size
android:width="270dp"
android:height="60dp"/>
</shape>
<强> button_background.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape_selected" android:state_selected="true" />
<item android:drawable="@drawable/shape_selected" android:state_pressed="true" />
<item android:drawable="@drawable/shape_unselected" />
</selector>
然后您将button_background
用于Button
s Background
财产:
<Button
...
android:background="@drawable/buttonshape"
local:MvxBind="Click StartStopCommand" />
否则,如果你想继续使用你的属性来设置BackgroundColor
而没有形状,你将需要使用Background
属性,有一个动态构建可绘制形状的转换器。 / p>
所以在您的转换器中,您只需返回一个ShapeDrawable
颜色,您可以像这样构建:
private ShapeDrawable CreateShapeDrawable(Color color)
{
var roundRect = new RoundRectShape (new [] { 10f, 10f, 10f, 10f, 10f, 10f, 10f, 10f }, null, null);
var shape = new ShapeDrawable (roundRect) {
Paint = new Paint { Color = color }
};
return shape;
}
修改强>
这样的东西可能适用于转换器方法:
public class MyStateToDrawableConverter : MvxValueConverter<MvxColor, Drawable>
{
protected override Drawable Convert(MvxColor value, object parameter, CultureInfo culture)
{
return CreateShapeDrawable(value.ToNative());
}
private ShapeDrawable CreateShapeDrawable(Color color)
{
var roundRect = new RoundRectShape (new [] { 10f, 10f, 10f, 10f, 10f, 10f, 10f, 10f }, null, null);
var shape = new ShapeDrawable (roundRect) {
Paint = new Paint { Color = color }
};
return shape;
}
}
答案 1 :(得分:1)
<强> button_selected 强>
<solid android:color="@color/btn_grey" />
<stroke
android:width="1dp"
android:color="@color/transparant" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<corners
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp" />
<强> button_unselected 强>
<solid android:color="@color/orange_500" />
<stroke
android:width="1dp"
android:color="@color/transparant" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<corners
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp" />
在java文件中
私人按钮btnMap;
btnMap =(按钮)findViewById(R.id.btn_map);
如果(布尔) { btnMap.setBackgroundDrawable(getResources()getDrawable(R.drawable.button_selected)); }
其他{ btnMap.setBackgroundDrawable(getResources()getDrawable(R.drawable.button_unselected));