如何以编程方式在视图上设置自定义属性
How to set a custom attribute on a view programmatically
我正在尝试以编程方式为我的视图设置自定义属性,以设置验证状态。
首先,我为文本字段创建了这个布局:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="@android:color/transparent" />
</shape>
</item>
<item android:right="1dp" android:left="1dp">
<shape>
<solid android:color="@color/state_color" />
</shape>
</item>
<!-- main color -->
<item
android:bottom="1.5dp"
android:left="2.5dp"
android:right="2.5dp">
<shape>
<solid android:color="@android:color/white" />
</shape>
</item>
<!-- draw another block to cut-off the left and right bars -->
<item android:bottom="5.0dp">
<shape>
<solid android:color="@android:color/white" />
</shape>
</item>
然后定义了这个属性:
<attr name="validation_state" format="enum">
<enum name="None" value="0"/>
<enum name="Error" value="1"/>
<enum name="Warning" value="2"/>
<enum name="Success" value="3"/>
</attr>
我也定义了这些颜色定义state_color.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:color="@color/state_error"
app:validation_state="Error"/>
<item
android:color="@color/state_warning"
app:validation_state="Warning"/>
<item
android:color="@color/state_success"
app:validation_state="Success"/>
<item
android:color="@color/state_default"/>
最后我创建了一个自己的 EditText class 它扩展了 Android 框架
private static final int[] STATE_MANDATORY = { R.attr.mandatory };
private static final int[] STATE_READONLY = { R.attr.readonly };
private static final int[] STATE_VALIDATION_STATE = { R.attr.validation_state };
private boolean _mandatory = false;
private boolean _readonly = false;
private ValidationState _validationState = ValidationState.NONE;
public mcEditText(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
public void setMandatory(final boolean mandatory)
{
_mandatory = mandatory;
refreshDrawableState();
}
@Override
public void setReadOnly(final boolean readonly)
{
_readonly = readonly;
refreshDrawableState();
}
@Override
public void setValidationState(final ValidationState state)
{
_validationState = state;
refreshDrawableState();
}
@Override
protected int[] onCreateDrawableState(int extraSpace)
{
final int[] drawableState = super.onCreateDrawableState(extraSpace + 3);
if (_mandatory)
{
mergeDrawableStates(drawableState, STATE_MANDATORY);
}
if (_readonly)
{
mergeDrawableStates(drawableState, STATE_READONLY);
}
if (_validationState != ValidationState.NONE)
{
mergeDrawableStates(drawableState, STATE_VALIDATION_STATE);
}
return drawableState;
}
我已将此颜色定义添加到我的视图中,它也能识别它,因此会显示错误状态。但是现在我不知道如何在不同状态之间切换。我需要以编程方式设置属性 "validation_state",但这怎么可能?
似乎android不支持这种工作的枚举属性。您必须使用布尔属性
<attr name="validation_state_none" format="boolean"/>
<attr name="validation_state_error" format="boolean"/>
...
您尝试做的最常见示例是可聚焦、可编辑的属性。它由 android source
中的原子布尔值属性处理
另一个可能对您有帮助的解决方案(未测试)是以编程方式创建您自己的可绘制对象。看看DrawableContainer and StateListDrawable
我正在尝试以编程方式为我的视图设置自定义属性,以设置验证状态。
首先,我为文本字段创建了这个布局:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="@android:color/transparent" />
</shape>
</item>
<item android:right="1dp" android:left="1dp">
<shape>
<solid android:color="@color/state_color" />
</shape>
</item>
<!-- main color -->
<item
android:bottom="1.5dp"
android:left="2.5dp"
android:right="2.5dp">
<shape>
<solid android:color="@android:color/white" />
</shape>
</item>
<!-- draw another block to cut-off the left and right bars -->
<item android:bottom="5.0dp">
<shape>
<solid android:color="@android:color/white" />
</shape>
</item>
然后定义了这个属性:
<attr name="validation_state" format="enum">
<enum name="None" value="0"/>
<enum name="Error" value="1"/>
<enum name="Warning" value="2"/>
<enum name="Success" value="3"/>
</attr>
我也定义了这些颜色定义state_color.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:color="@color/state_error"
app:validation_state="Error"/>
<item
android:color="@color/state_warning"
app:validation_state="Warning"/>
<item
android:color="@color/state_success"
app:validation_state="Success"/>
<item
android:color="@color/state_default"/>
最后我创建了一个自己的 EditText class 它扩展了 Android 框架
private static final int[] STATE_MANDATORY = { R.attr.mandatory };
private static final int[] STATE_READONLY = { R.attr.readonly };
private static final int[] STATE_VALIDATION_STATE = { R.attr.validation_state };
private boolean _mandatory = false;
private boolean _readonly = false;
private ValidationState _validationState = ValidationState.NONE;
public mcEditText(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
public void setMandatory(final boolean mandatory)
{
_mandatory = mandatory;
refreshDrawableState();
}
@Override
public void setReadOnly(final boolean readonly)
{
_readonly = readonly;
refreshDrawableState();
}
@Override
public void setValidationState(final ValidationState state)
{
_validationState = state;
refreshDrawableState();
}
@Override
protected int[] onCreateDrawableState(int extraSpace)
{
final int[] drawableState = super.onCreateDrawableState(extraSpace + 3);
if (_mandatory)
{
mergeDrawableStates(drawableState, STATE_MANDATORY);
}
if (_readonly)
{
mergeDrawableStates(drawableState, STATE_READONLY);
}
if (_validationState != ValidationState.NONE)
{
mergeDrawableStates(drawableState, STATE_VALIDATION_STATE);
}
return drawableState;
}
我已将此颜色定义添加到我的视图中,它也能识别它,因此会显示错误状态。但是现在我不知道如何在不同状态之间切换。我需要以编程方式设置属性 "validation_state",但这怎么可能?
似乎android不支持这种工作的枚举属性。您必须使用布尔属性
<attr name="validation_state_none" format="boolean"/>
<attr name="validation_state_error" format="boolean"/>
...
您尝试做的最常见示例是可聚焦、可编辑的属性。它由 android source
中的原子布尔值属性处理另一个可能对您有帮助的解决方案(未测试)是以编程方式创建您自己的可绘制对象。看看DrawableContainer and StateListDrawable