Tôi đang cố gắng đặt các thuộc tính kiểu được lấy từ Chủ đề của tôi bằng mã.
Lý do của tôi là tôi muốn sử dụng kiểu từ Chủ đề của riêng mình, NHƯNG Giao diện người dùng của tôi được tạo hoàn toàn bằng mã (sử dụng trình tạo bố cục tùy chỉnh), mà không xác định bất kỳ tiện ích nào trong XML. Vì vậy, tôi không thể đặt kiểu trong bố cục XML của tiện ích con - không có bố cục XML nào.
Tôi nghĩ rằng tôi sẽ có thể thiết lập phong cách này trong mã của widget của tôi bằng cách sử dụng
TypedArray a = context.obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)
Đây có vẻ như (với tôi) rằng
AttributeSet set = null;
vì đây là những gì các inflater XML sẽ cung cấp.
int[] attrs = R.styleable.MyWidget;
xác định thuộc tính tôi muốn xem.
int defStyleAttr = myWidgetStyle;
là tham chiếu, được xác định trong Chủ đề của tôi, theo kiểu cho MyWidget. Cả hai đều được định nghĩa trong các tệp XML trong res/values. “myWidgetStyle” theo mẫu của nhà phát triển Android đã sử dụng trong mã của họ.
defStyleRes = 0;
Tôi hy vọng rằng tôi không cần phải suy nghĩ về điều này.
Sau đó, để có được bất kỳ tài sản, chẳng hạn như một màu nền,
Color color = a.getColor(R.styleable.MyWidget_background, R.color.my_default);
a.recycle();
này dường như làm việc -so xa anyway.
Có vẻ như hệ thống xây dựng android thuận tiện tạo chỉ mục chính xác để sử dụng trong a.getColor và đặt tên là R.styleable.MyWidget_background
. Tôi đã không tạo tên này, vì vậy Android phải thực hiện nó bằng cách sử dụng XML của tôi cho MyWidget có thể tạo kiểu của tôi. Tôi mong đợi người ta có thể tìm kiếm chỉ mục chính xác bằng cách tìm kiếm TypedArray cho thuộc tính bắt buộc, nhưng điều đó sẽ không hiệu quả và TypedArray trông giống như một contraption khó chịu để giải quyết. Tôi sẽ sử dụng một cây gậy rất dài để chọc nó!
Don