web-dev-qa-db-ja.com

カスタム属性取得色が無効な値を返します

テキストビューの色を設定したいカスタムビューがあります。

私が持っています

attrs.xml

<declare-styleable name="PropertyView">
    <attr name="propertyTitle" format="string" localization="suggested" />
    <attr name="showTitle" format="boolean" />
    <attr name="propertyTextColor" format="color" />
    <attr name="propertyTextSize" format="dimension" />
</declare-styleable>

レイアウトファイルに設定しました

<com.something.views.PropertyView
    Android:id="@+id/dwf_rAwayTeamTimePenaltyInput"
    style="@style/mw"
    propertyview:propertyTextSize="16sp"
    propertyview:propertyTitle="@string/AwayTeam"
    propertyview:showTitle="true"
    propertyview:propertyTextColor="@color/textLight" />

そして私のコードでそれを設定しました

    TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.PropertyView, 0, 0);

    showTitle = a.getBoolean(R.styleable.PropertyView_showTitle, false);
    String title = a.getString(R.styleable.PropertyView_propertyTitle);
    float textSize = a.getDimension(R.styleable.PropertyView_propertyTextSize, -1);
    int color = a.getColor(R.styleable.PropertyView_propertyTextColor, -1);
    textSize = textSize / getResources().getDisplayMetrics().scaledDensity;
    if(BuildConfig.DEBUG) Log.e(getClass().getName(), "Color set to: " + color);

    setShowTitle(showTitle);
    setTitle(title);
    if(textSize >= 0) mTitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize);
    if(color != -1) mTitleTextView.setTextColor(color);

    a.recycle();

しかし、色は-1を返し続けます。また、色を#000に設定しようとすると、-16777216の値が取得されます

私もa.getIntegerとa.getIntを試しました

この問題や提案を経験した人はいますか?

ソリューション、Alex Fuに感謝

getColorは参照を処理できません

現在動作しています

ColorStateList color = a.getColorStateList(R.styleable.PropertyView_propertyTextColor);
mTitleTextView.setTextColor(color);
24
Saren Inden

あなたの例では色への参照を使用していますが、attrs.xmlファイルによると、そのプロパティ参照ではなく色タイプである必要がありますです。これがおそらく、16進数のカラーコードを使用したときに機能したが、参照を使用すると-1が返された理由です。

フォーマットを参照に変更する場合は、それを取得するメソッドもa.getColor()からa.getColorStateList()に変更する必要があります。

20
Alex Fu

これはattrsの一種のバグです。

以下は完全に動作します。


attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Your View -->
    <declare-styleable name="YourView">
        <attr name="tint_color" format="reference" /> <!-- Important -->
        <attr name="ripple_drawable" format="reference" /> <!-- Important -->
    </declare-styleable>

</resources>

YourView.Java

public YourView(Context context) {
    this(context, null);
}

public YourView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0);
}

public YourView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    // Get attrs
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.YourView, defStyleAttr, 0);

    // Set tint
    int tintStyle = R.styleable.YourView_tint_color;
    if (a.hasValue(tintStyle)) {
        mTintColor = a.getResourceId(tintStyle, 0); // Important
        setTint(mTintColor);
    }

    // Set Ripple
    int rippleStyle = R.styleable.YourView_ripple_drawable;
    if (a.hasValue(rippleStyle)) {
        mRippleDrawable = a.getResourceId(rippleStyle, 0); // Important
        setRipple(mRippleDrawable);
    }

    // End
    a.recycle();
}

使用方法

<com.your.app.YourView
    ...
    app:ripple_drawable="@drawable/ripple_default"
    app:tint_color="@color/colorWhite" />
9
Michael