私はこれを使用してプログラムでColorStateList
を作成しようとしています:
ColorStateList stateList = new ColorStateList(states, colors);
しかし、2つのパラメーターが何なのかわかりません。
ドキュメントに従って:
public ColorStateList (int[][] states, int[] colors)
APIレベル1で追加
状態から色への指定されたマッピングを返すColorStateListを作成します。
誰かがこれを作成する方法を説明してもらえますか?
状態の2次元配列の意味は何ですか?
使用可能な状態のリストについては、 http://developer.Android.com/reference/Android/R.attr.html#state_above_anchor をご覧ください。
無効、フォーカスされていない、チェックされていない状態などの色を設定する場合は、状態を無効にします。
int[][] states = new int[][] {
new int[] { Android.R.attr.state_enabled}, // enabled
new int[] {-Android.R.attr.state_enabled}, // disabled
new int[] {-Android.R.attr.state_checked}, // unchecked
new int[] { Android.R.attr.state_pressed} // pressed
};
int[] colors = new int[] {
Color.BLACK,
Color.RED,
Color.GREEN,
Color.BLUE
};
ColorStateList myList = new ColorStateList(states, colors);
最初の次元は状態セットの配列であり、2番目は状態セット自体です。カラー配列は、一致する各状態セットの色をリストするため、カラー配列の長さは状態配列の最初の次元と一致する必要があります(または状態が「使用」されるとクラッシュします)。ここと例:
ColorStateList myColorStateList = new ColorStateList(
new int[][]{
new int[]{Android.R.attr.state_pressed}, //1
new int[]{Android.R.attr.state_focused}, //2
new int[]{Android.R.attr.state_focused, Android.R.attr.state_pressed} //3
},
new int[] {
Color.RED, //1
Color.GREEN, //2
Color.BLUE //3
}
);
お役に立てれば。
編集例:次のようなxmlカラー状態リスト:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true" Android:color="@color/white"/>
<item Android:color="@color/black"/>
</selector>
このようになります
ColorStateList myColorStateList = new ColorStateList(
new int[][]{
new int[]{Android.R.attr.state_pressed},
new int[]{}
},
new int[] {
context.getResources().getColor(R.color.white),
context.getResources().getColor(R.color.black)
}
);
時にはこれで十分です:
int colorInt = getResources().getColor(R.color.ColorVerificaLunes);
ColorStateList csl = ColorStateList.valueOf(colorInt);
残念ながら、どの解決策も私には役に立たない。
ColorStateList themeColorStateList = new ColorStateList(
new int[][]{
new int[]{Android.R.attr.state_pressed},
new int[]{Android.R.attr.state_enabled},
new int[]{Android.R.attr.state_focused, Android.R.attr.state_pressed},
new int[]{-Android.R.attr.state_enabled},
new int[]{} // this should be empty to make default color as we want
},
new int[]{
pressedFontColor,
defaultFontColor,
pressedFontColor,
disabledFontColor,
defaultFontColor
}
);
これはソースコードのコンストラクタです。
/**
* Creates a ColorStateList that returns the specified mapping from
* states to colors.
*/
public ColorStateList(int[][] states, int[] colors) {
mStateSpecs = states;
mColors = colors;
if (states.length > 0) {
mDefaultColor = colors[0];
for (int i = 0; i < states.length; i++) {
if (states[i].length == 0) {
mDefaultColor = colors[i];
}
}
}
}
KotlinでプログラムでColorList
を作成する方法の例を次に示します。
val colorList = ColorStateList(
arrayOf(
intArrayOf(-Android.R.attr.state_enabled), // Disabled
intArrayOf(Android.R.attr.state_enabled) // Enabled
),
intArrayOf(
Color.BLACK, // The color for the Disabled state
Color.RED // The color for the Enabled state
)
)
Create ColorStateList
のビルダークラス
private class ColorStateListBuilder {
List<Integer> colors = new ArrayList<>();
List<int[]> states = new ArrayList<>();
public ColorStateListBuilder addState(int[] state, int color) {
states.add(state);
colors.add(color);
return this;
}
public ColorStateList build() {
return new ColorStateList(convertToTwoDimensionalIntArray(states),
convertToIntArray(colors));
}
private int[][] convertToTwoDimensionalIntArray(List<int[]> integers) {
int[][] result = new int[integers.size()][1];
Iterator<int[]> iterator = integers.iterator();
for (int i = 0; iterator.hasNext(); i++) {
result[i] = iterator.next();
}
return result;
}
private int[] convertToIntArray(List<Integer> integers) {
int[] result = new int[integers.size()];
Iterator<Integer> iterator = integers.iterator();
for (int i = 0; iterator.hasNext(); i++) {
result[i] = iterator.next();
}
return result;
}
}
使用例
ColorStateListBuilder builder = new ColorStateListBuilder();
builder.addState(new int[] { Android.R.attr.state_pressed }, ContextCompat.getColor(this, colorRes))
.addState(new int[] { Android.R.attr.state_selected }, Color.GREEN)
.addState(..., some color);
if(// some condition){
builder.addState(..., some color);
}
builder.addState(new int[] {}, colorNormal); // must add default state at last of all state
ColorStateList stateList = builder.build(); // ColorStateList created here
// textView.setTextColor(stateList);
リソースを使用する場合、Colors.xml
int[] colors = new int[] {
getResources().getColor(R.color.ColorVerificaLunes),
getResources().getColor(R.color.ColorVerificaMartes),
getResources().getColor(R.color.ColorVerificaMiercoles),
getResources().getColor(R.color.ColorVerificaJueves),
getResources().getColor(R.color.ColorVerificaViernes)
};
ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{colors[0]});
example.setBackgroundTintList(csl);