如何在程序中为视图设置自定义属性

3

我将尝试以编程方式为我的视图设置自定义属性,以设置验证状态。

首先,我为文本字段创建了以下布局:

<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类,它扩展了Android框架中的一个EditText类。

    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 文档中的“应用自定义属性”部分:https://developer.android.com/training/custom-views/create-view.html - Thomas Mary
@ThomasMary:这部分只是描述了如何读取属性,而没有说明我如何更改它们。 - Roman
1个回答

1
似乎 Android 不支持此类工作的枚举属性。您必须使用布尔属性。
<attr name="validation_state_none" format="boolean"/>
<attr name="validation_state_error" format="boolean"/>
...

您要做的最常见的示例是可聚焦、可编辑的属性。它使用原子布尔属性在 android source 中处理。
另一个可能会帮助您的解决方案(未经测试)是通过编程方式创建自己的可绘制对象。请查看 DrawableContainerStateListDrawable

好的,谢谢你。我本来希望能用枚举实现,但那我就这样做吧 :) - Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接