2012-01-06 32 views
5

Tôi đang sử dụng thuộc tính tùy chỉnh để triển khai chuyển đổi chủ đề trong ứng dụng của mình. Tôi đã thuộc tính sau được xác định:setTextAppearance thông qua mã tham chiếu thuộc tính tùy chỉnh

<resources> 
    <attr name="TextAppearance_Footer" format="reference"></attr> 
</resources> 

Tôi có hai chủ đề mà xác định thuộc tính này cách khác nhau:

<style name="NI_AppTheme.Dark"> 
    <item name="TextAppearance_Footer">@style/Footer</item> 
</style> 

Các @style/Footer được định nghĩa như sau:

<style name="Footer" parent="@android:style/TextAppearance.Large"> 
    <item name="android:textColor">#00FF00</item> // Green 
</style> 

Bây giờ nếu tôi cố gắng đặt kiểu này thành TextView bằng cách sử dụng:

textView.setTextAppearance(this, R.attr.TextAppearance_Footer); 

Nó không hoạt động (tức là không đặt văn bản thành Green). Tuy nhiên, nếu tôi chỉ định giao diện văn bản qua xml sử dụng:

android:textAppearance="?TextAppearance_Footer" 

Nó hoạt động tốt. Tôi có thể bỏ lỡ điều gì? Tôi cần phải thiết lập các thuộc tính bởi vì tôi muốn tự động có thể chuyển đổi giữa các chủ đề.

Thông tin bổ sung:

Nếu tôi sử dụng:

textView.setTextAppearance(this, R.style.NI_AppTheme.Dark); 

Có vẻ như để làm việc thôi.

EDIT: Tested Giải pháp làm việc (nhờ @nininho):

Resources.Theme theme = getTheme(); 
TypedValue styleID = new TypedValue(); 
if (theme.resolveAttribute(R.attr.Channel_Title_Style, styleID, true)) { 
    channelTitle.setTextAppearance(this, styleID.data); 
} 

Trả lời

11

Tại sao không sử dụng:

textView.setTextAppearance(this, R.style.Footer); 

Tôi nghĩ rằng textAppearance phải là một phong cách.

Edit:

Có lẽ bạn nên thử điều này:

TypedArray a = context.obtainStyledAttributes(attrs, 
new int[] { R.attr.TextAppearance_Footer }); 

int id = a.getResourceId(R.attr.TextAppearance_Footer, defValue); 
textView.setTextAppearance(this, id); 

EDIT: Đúng Mã Tested:

Resources.Theme theme = getTheme(); 
TypedValue styleID = new TypedValue(); 
if (theme.resolveAttribute(R.attr.Channel_Title_Style, styleID, true)) { 
    channelTitle.setTextAppearance(this, styleID.data); 
} 
+0

Bởi vì có lẽ anh ta muốn có điều này được lựa chọn thông qua chủ đề, và không sử dụng R.style.Footer trực tiếp. – aromero

+0

Vì vậy, ông nên sử dụng các chủ đề, nhưng từ câu hỏi ông không muốn sử dụng nó (không biết tại sao) –

+0

Không chắc chắn đó là trường hợp. Những gì anh ta đang cố gắng làm là ủy quyền phong cách TextAppearance cho chủ đề. TextAppearance_Footer là thuộc tính thực hiện liên kết, ví dụ, giả sử bạn có theme1 và theme2. theme1 sẽ nói TextAppearance_Footer => textAppearance1 và theme2 sẽ nói TextAppearance_Footer => textAppearance2. Trong các widget của bạn, bạn chỉ cần nói textAppearance => TextAppearance_Footer.Những gì bạn nhận được là một kiểu liên kết tự động dựa trên chủ đề hiện tại – aromero

Các vấn đề liên quan