2011-07-14 40 views
7

Tôi có số AlertDialog trong đơn đăng ký của mình. Nó chứa danh sách các chế độ xem tùy chỉnh với các tiện ích con bên trong là TextView. Mọi thứ hoạt động tốt trên Android 2.x. Các AlertDialog được tạo ra với danh sách trắng và văn bản màu đen trong đó. Nhưng khi tôi chạy ứng dụng của mình trên thiết bị Android 3.x, tất cả TextView s đều có màu đen và nền của danh sách cũng màu đen. Vì vậy, tôi không thể nhìn thấy văn bản cho đến khi tôi nhấn và giữ một trong các mục.Android: Cách đặt màu văn bản cho các mục danh sách trong AlertDialog đúng cách

Dưới đây là định nghĩa một TextView 's từ file layout:

<TextView 
    android:id="@+id/label" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:singleLine="true" 
    android:ellipsize="marquee" 
    android:textAppearance="?android:attr/textAppearanceSmallInverse" /> 

Tôi nghĩ rằng việc sử dụng textAppearanceSmallInverse cho thuộc tính textAppearance là một cách thích hợp để thiết lập các thông số văn bản và nó phải làm việc trên tất cả các thiết bị nhưng dường như tôi đã sai rồi. Vì vậy, tôi nên làm gì để hiển thị các mục danh sách hiển thị AlertDialog đúng cách trên tất cả các nền tảng? Cảm ơn trước.

+1

Câu hỏi này khá cũ, nhưng có thể ai đó khác sẽ được hưởng lợi từ việc này. Giải pháp là tận dụng lựa chọn tài nguyên được tích hợp của Android để đạt được những gì bạn đang tìm kiếm. Xem [this] (http://kmansoft.com/2011/10/15/alertdialog-custom-listview-items-and-honeycomb/) hướng dẫn để được hướng dẫn. – howettl

+0

Tôi đã sử dụng chính xác cách tiếp cận tương tự trong dự án của mình, nhưng hy vọng một giải pháp tốt hơn đã tồn tại. – Michael

+0

Tại sao câu trả lời của tôi bị xóa? – howettl

Trả lời

2

Giải pháp là để tận dụng Android tích hợp trong hệ thống lựa chọn tài nguyên. Bạn nên chỉ định hai kiểu khác nhau và đặt chúng vào các thư mục thích hợp dựa trên phiên bản API. Lưu ý rằng các ví dụ sau đây không phải của tôi, tôi lấy chúng từ hướng dẫn this.

res/values-v4/styles.xml:

<resources> 

<!-- Text for listboxes, inverted for Andorid prior to 3.0 --> 

<style name="MyListTextAppearanceSmall"> 
    <item name="android:textAppearance">?android:attr/textAppearanceSmallInverse</item> 
</style> 

<style name="MyListTextAppearanceDefault"> 
    <item name="android:textAppearance">?android:attr/textAppearanceInverse</item> 
</style> 

<style name="MyListTextAppearanceMedium"> 
    <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item> 
</style> 
</resources> 

res/values-v11/styles.xml:

<resources> 
    <!-- Text for listboxes, non-inverted starting with Android 3.0 --> 

    <style name="MyListTextAppearanceSmall"> 
     <item name="android:textAppearance">?android:attr/textAppearanceSmall</item> 
    </style> 

    <style name="MyListTextAppearanceDefault"> 
     <item name="android:textAppearance">?android:attr/textAppearance</item> 
    </style> 

    <style name="MyListTextAppearanceMedium"> 
     <item name="android:textAppearance">?android:attr/textAppearanceMedium</item> 
    </style> 
</resources> 

Sau đó, trong TextView của bạn, xác định kiểu như vậy:

<TextView 
    android:style="@style/MyListTextAppearanceSmall" 
    android:id="@+id/label" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:singleLine="true" 
    android:ellipsize="marquee" /> 

Xem hướng dẫn liên kết ở trên cho một lời giải thích dài hơn .

0

Điều này có thể xảy ra vì bạn không chỉ định chủ đề, sau đó nó sẽ trở về chủ đề mặc định. Trong 2.x này nên được Theme.Black và trong 3.x Theme.Holo (hoặc Theme.Light, không chắc chắn về điều này). Sau đó, textAppearanceSmallInverse giải quyết theo phong cách khác nhau trong mỗi chủ đề.

+0

Tôi đang sử dụng 'Chủ đề' trong 2.x và 'Theme.Holo' trong 3.x. Nhưng vấn đề là 'AlertDialog' sử dụng các kiểu đối diện trên các nền tảng khác nhau. Nhưng cả hai nền tảng đều sử dụng cùng một kiểu cho văn bản tiêu đề. Đó là hành vi kỳ lạ. – Michael

1

Mã của bạn cho hộp thoại bật lên sẽ trông giống như thế này:

// Sets dialog for popup dialog list 
AlertDialog dialog; 
String[] items = {"exampleItem"}; 
ListAdapter itemlist = new ArrayAdapter(this, android.R.layout.simple_list_item_1, items); 
AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setTitle("Title"); 
builder.setAdapter(itemlist, new DialogInterface.OnClickListener() 
{ 
    public void onClick(DialogInterface dialog, int item) 
    { 
    } 
}); 
dialog = builder.create(); 
dialog.getListView().setBackgroundColor(Color.WHITE); 

Ở đây, bạn đang nhận được listview và thiết lập màu nền sang màu trắng. Nếu bạn muốn thay đổi màu sắc của văn bản đối với từng TextView thì bạn cần phải xác định màu sắc của họ trong cách bố trí của TextView, trong trường hợp này màu đen:

android:textColor="#000000" 
+0

Cảm ơn bạn đã trả lời nhưng tôi không muốn thay đổi nền của danh sách. Tôi muốn nó trông giống như nó nên nhìn trên một nền tảng cụ thể. Tất cả những gì tôi muốn là thiết lập một kiểu văn bản thích hợp để làm cho nó có thể đọc được trên mọi nền tảng. – Michael

1

Câu trả lời được chấp nhận có vẻ hơi quá mức. Tôi chỉ đơn giản là buộc nền nghịch đảo bằng cách gọi:

dialogBuilder.setInverseBackgroundForced(true); 

giải quyết vấn đề tốt.

+0

Theo như tôi nhớ lá cờ này không giải quyết được vấn đề trên cả Android 2.x và Android 3.x. – Michael

+1

setInverseBackgroundForced hiện không còn được dùng nữa –

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