Android создает селектор программно
Как я могу создать селектор программно?
У меня есть селектор xml, который присваивается TabWidget
как Tab indicator color
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Non focused states -->
<item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/bg_tab_unselected" />
<item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/bg_tab_selected" />
<!-- Focused states -->
<item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/bg_tab_unselected_focused" />
<item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/bg_tab_selected_focused" />
<!-- Pressed -->
<!-- Non focused states -->
<item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/bg_tab_unselected_pressed" />
<item android:state_focused="false" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/bg_tab_selected_pressed" />
<!-- Focused states -->
<item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/bg_tab_unselected_pressed" />
<item android:state_focused="true" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/bg_tab_selected_pressed" />
</selector>
Есть ли способ создать выше xml-код динамически?
Ответы
Ответ 1
вы можете использовать его следующим образом:
public static StateListDrawable makeSelector(int color) {
StateListDrawable res = new StateListDrawable();
res.setExitFadeDuration(400);
res.setAlpha(45);
res.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(color));
res.addState(new int[]{}, new ColorDrawable(Color.TRANSPARENT));
return res;
}
а затем:
view.setBackground(makeSelector(Color.RED));
Ответ 2
Вы можете напрямую создать StateListDrawable
и использовать addState
для добавления состояний, которые вы определили в XML:
StateListDrawable d = new StateListDrawable();
[...]
int[] sFocusedSelected = { android.R.attr.state_focused, android.R.attr.state_selected };
Drawable dFocusedSelected = getDrawable(R.drawable.bg_tab_selected_focused);
d.addState(sFocusedSelected, dFocusedSelected);
[...]
Те же правила применяются, что и для XML:
Выбор не основан на "наилучшем совпадении", а просто на первом элементе, который соответствует минимальным критериям состояния.