2013-04-04 33 views
5

Tôi nhận ra, cho Context.getTheme(), nó thường không làm việc tốt nếu chúng tôi sử dụng Application như ContextTại sao getTheme không hoạt động tốt trên Application

MyApplication.singletonInstance().getTheme().resolveAttribute(R.attr.actionBarDeleteIcon, typedValue, true); 
// typedValue.resourceId will be 0x0, which is invalid 

Tuy nhiên, nếu tôi sử dụng Activity như bối cảnh, nó hoạt động well

MyFragment.this.getActivity().getTheme().resolveAttribute(R.attr.actionBarDeleteIcon, typedValue, true); 
// typedValue.resourceId is valid 

Tôi đã tự hỏi tại sao chúng tôi không thể giải quyết thuộc tính thông qua Application?

Trong tệp kê khai, chúng tôi tìm thấy thông tin chủ đề cụ thể ở mức Application. Vì vậy, tôi nghĩ rằng nhận được chủ đề từ Application đối tượng không có ý nghĩa.

<application 
    android:theme="..." 

Trả lời

3

Nó không làm việc vì rõ ràng là đối tượng được trả về bởi getApplicationContext() không phải là một đối tượng hoàn chỉnh Context, như đã nêu in this answer by CommonsWare:

Đó không phải là hoàn toàn Context, hỗ trợ tất cả những gì Activity làm. Những điều khác nhau bạn sẽ cố gắng làm với điều này Context sẽ thất bại, chủ yếu liên quan đến GUI.

Một giải pháp tiềm năng là để tự thiết lập các chủ đề trên Context rằng, như thế này:

getApplicationContext().getTheme().applyStyle(R.style.MyTheme, true); 

Nhưng phương pháp này không được xác nhận bởi các đội dev Android; giải pháp đúng là sử dụng Activity cho những thứ có liên quan đến giao diện người dùng, như getTheme().

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