Không phải trong số các câu trả lời được cung cấp là chính xác.
Bạn có thể thiết lập phong cách theo chương trình.
Câu trả lời ngắn gọn là hãy xem http://grepcode.com/file/reposective.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/content/Context.java#435
Câu trả lời dài. Đây là đoạn trích của tôi để đặt kiểu được xác định tùy chỉnh theo chương trình cho chế độ xem của bạn:
1) Tạo một kiểu trong tệp kiểu tệp của bạn
<style name="MyStyle">
<item name="customTextColor">#39445B</item>
<item name="customDividerColor">#8D5AA8</item>
</style>
Đừng quên xác định các thuộc tính tùy chỉnh của bạn trong tệp attrs.xml
Tệp attrsl.xml của tôi:
<declare-styleable name="CustomWidget">
<attr name="customTextColor" format="color" />
<attr name="customDividerColor" format="color" />
</declare-styleable>
Lưu ý rằng bạn có thể sử dụng bất kỳ tên nào cho kiểu dáng của bạn (CustomWidget của tôi)
Bây giờ, hãy đặt kiểu cho tiện ích theo chương trình Đây là tiện ích đơn giản của tôi:
public class StyleableWidget extends LinearLayout {
private final StyleLoader styleLoader = new StyleLoader();
private TextView textView;
private View divider;
public StyleableWidget(Context context) {
super(context);
init();
}
private void init() {
inflate(getContext(), R.layout.widget_styleable, this);
textView = (TextView) findViewById(R.id.text_view);
divider = findViewById(R.id.divider);
setOrientation(VERTICAL);
}
protected void apply(StyleLoader.StyleAttrs styleAttrs) {
textView.setTextColor(styleAttrs.textColor);
divider.setBackgroundColor(styleAttrs.dividerColor);
}
public void setStyle(@StyleRes int style) {
apply(styleLoader.load(getContext(), style));
}
}
bố trí:
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="22sp"
android:layout_gravity="center"
android:text="@string/styleble_title" />
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"/>
</merge>
Và cuối cùng là triển khai lớp StyleLoader
public class StyleLoader {
public StyleLoader() {
}
public static class StyleAttrs {
public int textColor;
public int dividerColor;
}
public StyleAttrs load(Context context, @StyleRes int styleResId) {
final TypedArray styledAttributes = context.obtainStyledAttributes(styleResId, R.styleable.CustomWidget);
return load(styledAttributes);
}
@NonNull
private StyleAttrs load(TypedArray styledAttributes) {
StyleAttrs styleAttrs = new StyleAttrs();
try {
styleAttrs.textColor = styledAttributes.getColor(R.styleable.CustomWidget_customTextColor, 0);
styleAttrs.dividerColor = styledAttributes.getColor(R.styleable.CustomWidget_customDividerColor, 0);
} finally {
styledAttributes.recycle();
}
return styleAttrs;
}
}
Bạn có thể tìm thấy ví dụ hoạt động đầy đủ tại https://github.com/Defuera/setStylableProgramatically