質問
Q1 : xml セレクターで動作するカスタム文字列/列挙型属性を取得できた人はいますか? [1] に従って動作するブール属性を取得しましたが、文字列属性は取得しませんでした。
編集:答えてくれてありがとう。現在、android はブール セレクターのみをサポートしています。理由については、受け入れられた回答を参照してください。
外観が 2 つの変数に依存する少し複雑なカスタム ボタンを実装する予定です。その他は、ブール属性 (true または false) と別のカテゴリのような属性 (多くの異なる値を持つ) です。私の計画は、ブール値と文字列 (または多分列挙型?) 属性を使用することです。ブール値と文字列属性を使用して xml セレクターで UI を定義できることを望んでいました。
Q2 : なぜ [1] onCreateDrawableState() でブール属性が true の場合にのみマージされるのですか?
これは私がテストしたものです。ブール属性は機能しますが、文字列は機能しません
注: これは、xml セレクターで string/enum 属性が可能かどうかを確認するための単なるテスト アプリです。カスタム属性なしでボタンのテキストカラーを設定できることを知っています。
私のデモ アプリケーションでは、boolean 属性を使用してボタンの背景を暗い/明るいに設定し、string 属性を使用してテキストの色を {"red"、"green"、"blue"} のいずれかに設定します。属性はで定義されています/res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyCustomButton">
<attr name="make_dark_background" format="boolean" />
<attr name="str_attr" format="string" />
</declare-styleable>
</resources>
実現したいセレクターは次のとおりです。
@drawable/custom_button_background (動作します)
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.example.customstringattribute">
<item app:make_dark_background="true" android:drawable="@color/dark" />
<item android:drawable="@color/bright" />
</selector>
@color/custom_button_text_color (これは機能しません)
<selector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.example.customstringattribute">
<item app:str_attr="red" android:color="@color/red" />
<item app:str_attr="green" android:color="@color/green" />
<item app:str_attr="blue" android:color="@color/blue" />
<item android:color="@color/grey" />
</selector>
カスタム ボタンの背景をブール セレクターに接続し、テキストの色を文字列セレクターに接続する方法を次に示します。
<com.example.customstringattribute.MyCustomButton
...
android:background="@drawable/custom_button_background"
android:textColor="@color/custom_button_text_color"
...
/>
init() メソッドで属性をロードする方法は次のとおりです。
private void init(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs,
R.styleable.MyCustomButton);
final int N = a.getIndexCount();
for (int i = 0; i < N; ++i)
{
int attr = a.getIndex(i);
switch (attr)
{
case R.styleable.MyCustomButton_str_attr:
mStrAttr = a.getString(attr);
break;
case R.styleable.MyCustomButton_make_dark_background:
mMakeDarkBg = a.getBoolean(attr, false);
break;
}
}
a.recycle();
}
属性の int[] 配列があります
private static final int[] MAKE_DARK_BG_SET = { R.attr.make_dark_background };
private static final int[] STR_ATTR_ID = { R.attr.str_attr };
そして、これらの int[] 配列は描画可能な状態にマージされます
@Override
protected int[] onCreateDrawableState(int extraSpace) {
Log.i(TAG, "onCreateDrawableState()");
final int[] drawableState = super.onCreateDrawableState(extraSpace + 2);
if(mMakeDarkBg){
mergeDrawableStates(drawableState, MAKE_DARK_BG_SET);
}
mergeDrawableStates(drawableState, STR_ATTR_ID);
return drawableState;
}
また、属性セッター メソッドに refreshDrawableState() があります。
public void setMakeDarkBg(boolean makeDarkBg) {
if(mMakeDarkBg != makeDarkBg){
mMakeDarkBg = makeDarkBg;
refreshDrawableState();
}
}
public void setStrAttr(String str) {
if(mStrAttr != str){
mStrAttr = str;
refreshDrawableState();
}
}
[1] :カスタム ボタン状態を追加する方法