簡體   English   中英

如何以編程方式在視圖上設置自定義屬性

[英]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 類,它擴展了 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 源代碼中使用 atomic booleans 屬性處理的

另一個可能對您有幫助(未經測試)的解決方案是以編程方式創建您自己的可繪制對象。 看看DrawableContainerStateListDrawable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM