2011-10-14 33 views
7

Tôi đang cố gắng Hiển thị hộp thoại từ PreferenceActivity, được đặt thành Theme.Light. Hộp thoại hiện với chữ màu tối trên nền tối:Android: Sự cố khi hiển thị hộp thoại từ Chủ đề.Light activity

enter image description here

tôi giả sử nó sử dụng chữ màu tối vì nó được thừa hưởng màu sắc văn bản từ các hoạt động phụ huynh, hoặc một cái gì đó tương tự. Tôi muốn hộp thoại sử dụng văn bản màu trắng trên nền tối hoặc sử dụng nền màu trắng có văn bản tối, như PreferenceActivity sẽ xuất hiện khi được đặt thành Theme.Light.

Điều này có vẻ là một vấn đề đã biết, các giải pháp mà tôi đã tìm thấy liên quan đến việc tạo và sử dụng kiểu tùy chỉnh mở rộng Theme.Dialog và sử dụng nó để khởi tạo hộp thoại. Một cái gì đó như:

<style name="CustomDialog" parent="@android:style/Theme.Dialog"> 
<item name="android:textColor">?android:attr/textColorPrimaryInverseDisableOnly</item> 
</style> 

Dialog dialog = new Dialog(context, R.style.CustomDialog); 

Tôi đã thử điều này, nhưng nó không có sự khác biệt. Tôi cũng đã thử một số giá trị khác nhau cho textColor, không ai trong số đó sửa đổi màu văn bản của Hộp thoại. Như một kiểm tra sanity, tôi đã thêm:

 <item name="android:background">#FFFF0000</item> 

theo kiểu, dẫn đến hộp thoại có nền màu đỏ (vì vậy tôi chắc chắn rằng tôi đang instantiating hộp thoại đúng).

Gần nhất tôi đã đi đến một giải pháp chỉ là thiết lập màu nền của hộp thoại thành màu trắng, cho phép hộp thoại bên dưới. Nhưng đây không phải là một giải pháp tốt, bởi vì một số phiên bản hoặc một số thiết bị có thể không sử dụng các hành vi tương tự tôi nhìn thấy khi đảo ngược màu sắc văn bản:

enter image description here

Vì vậy, là có một cách tốt để thiết lập màu chữ trên hộp thoại được hiển thị từ một hoạt động Theme.Light?

+0

Tôi dường như nhớ đang vật lộn với điều gì đó tương tự. Không bao giờ có nó để làm việc. Cách giải quyết cuối cùng của tôi là có nhiều tài nguyên giá trị, một trong số đó xác định màu tối cho Gingerbread, ví dụ: trong res/values-v8 và dưới dạng ánh sáng trong res/values. –

+0

Sự cám dỗ của tôi là mã hóa cứng nền của danh sách thành Trắng và màu văn bản của danh sách thành màu đen. Với hy vọng rằng điều này sẽ đảm bảo văn bản màu đen trên nền trắng, bất kể thiết bị hoặc phiên bản. – ab11

+0

Vâng vâng, điều đó chắc chắn sẽ hoạt động. Nhưng tôi cho rằng điểm đau này là hòa trộn với chủ đề thiết bị ...Gingerbread tối hơn nhiều so với các phiên bản trước, do đó nó là trường hợp đặc biệt. –

Trả lời

1

Tôi giả sử bạn sử dụng AlertDialog.Builder và đặt danh sách bằng một trong các phương pháp setSingleChoiceItems không sử dụng số ListAdapter của riêng bạn. Thay vào đó nó tạo ra riêng của nó thay vì với phong cách sai. Để khắc phục điều này, bạn nên gọi setSingleChoiceItems(ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener) và cung cấp bộ điều hợp như vậy sẽ sử dụng bố cục với kiểu cần thiết.

Bây giờ, tại sao điều này xảy ra. Việc tạo ra bộ chuyển đổi thực tế xảy ra trong file com.android.internal.app.AlertController, nơi dòng sau chọn cách bố trí cho các danh sách lựa chọn duy nhất:

int layout = mIsSingleChoice 
        ? R.layout.select_dialog_singlechoice : R.layout.select_dialog_item; 

Dưới đây là cách bố trí nói trên:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:textColor="@android:color/primary_text_light_disable_only" 
    android:gravity="center_vertical" 
    android:paddingLeft="12dip" 
    android:paddingRight="7dip" 
    android:checkMark="@android:drawable/btn_radio" 
    android:ellipsize="marquee" 
/> 

Như bạn thấy, dòng đó thiết lập màu văn bản không chứa tham chiếu đến một chủ đề, mà là một màu cứng. Đó là lý do tại sao khi điều này được thổi phồng trong quá trình tạo danh sách, nó sẽ luôn sử dụng cùng một màu, bất kể bạn muốn sử dụng kiểu nào. Vì vậy, hành động đúng đắn để khắc phục vấn đề này là sử dụng bố cục của riêng bạn và ListAdapter của riêng bạn.

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