Tôi đang vật lộn với vấn đề này trong một thời gian khá dài. Tôi đã tìm kiếm các giải pháp và thực tế đã có một số gợi ý cho các vấn đề liên quan, nhưng không có gì thực sự hiệu quả với tôi. Vì vậy, hãy nói rằng tôi muốn tạo một AlertDialog với một tin nhắn (dài), một hộp kiểm và hai nút.Màu văn bản/giao diện chính xác trong AlertDialog
// create dialog
AlertDialog.Builder dlg = new AlertDialog.Builder(this);
dlg.setTitle(R.string.dlg_title);
dlg.setMessage(R.string.dlg_msg);
// add checkbox
final CheckBox checkbox = new CheckBox(this);
dlg.setView(checkbox);
// add buttons
dlg.setPositiveButton(...);
dlg.setNegativeButton(...);
// show dialog
dlg.show();
này sẽ không hoạt, bởi vì nếu thông điệp thoại trở nên quá dài, hộp kiểm sẽ không được hiển thị hoàn toàn. Ngoài ra, nó sẽ được ẩn hoàn toàn ở chế độ ngang.
Tiếp theo, hãy thử tra cứu original dialog layout file (đối với tôi nó nằm dưới android-sdk-linux_86/platforms/android-17/data/res/layout/alert_dialog.xml) và cố gắng sao chép phần liên quan để tạo riêng của chúng tôi "bản sao" của cách bố trí bên trong hộp thoại, chỉ cần như thế này:
dialog_checkbox.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:overScrollMode="ifContentScrolls"
android:paddingBottom="12dip"
android:paddingLeft="14dip"
android:paddingRight="10dip"
android:paddingTop="2dip" >
<TextView
android:id="@+id/message"
style="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dip" />
</ScrollView>
<CheckBox
android:id="@+id/checkbox"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Chúng ta có thể cố gắng thêm quan điểm này đến hộp thoại của chúng tôi như thế này:
// create dialog
AlertDialog.Builder dlg = new AlertDialog.Builder(this);
dlg.setTitle(R.string.dlg_title);
// add checkbox
LinearLayout checkboxLayout = (LinearLayout) View.inflate(mContext, R.layout.dialog_checkbox, null);
((TextView) checkboxLayout.findViewById(R.id.message)).setText(R.string.dlg_msg);
mCheckbox = (CheckBox) checkboxLayout.findViewById(R.id.checkbox);
mCheckbox.setText(R.string.dlg_checkbox_msg);
setView(checkboxLayout);
// add buttons
dlg.setPositiveButton(...);
dlg.setNegativeButton(...);
// show dialog
dlg.show();
Điều này thực sự hoạt động khá. Hầu hết. Chúng tôi sẽ không thấy bất kỳ vấn đề nào cho đến khi chúng tôi sử dụng Theme.Light cho ứng dụng của chúng tôi. Nhưng ngay khi chúng ta sử dụng Theme.Light, màu văn bản của hộp thoại sẽ trở thành màu đen và không thể đọc được trên nền tối. TẠI SAO ?!
- Chúng tôi đã sao chép hộp thoại cảnh báo Android gốc xml mã nguồn bố cục. Nhưng mặc dù chúng tôi sử dụng attr/textAppearanceMedium như một kiểu văn bản, màu văn bản sẽ trở thành màu đen trong Theme.Light anyway.
- Nếu chúng ta sử dụng Theme.Light và tạo một hộp thoại "bình thường" với một tin nhắn thông thường thông qua setMessage, màu văn bản là màu trắng và có thể đọc được.
Có vấn đề gì? Làm thế nào để giải quyết điều này? Tôi không muốn đặt màu văn bản thành màu trắng hoặc đen theo chương trình, điều này sẽ không tốt cho các chủ đề người dùng tùy chỉnh. Bất kỳ đề xuất?
Như đã nói, tôi không thích giải pháp này. Điều gì, nếu ai đó sử dụng chủ đề tùy chỉnh, trong đó hộp thoại có nền sáng và màu văn bản tối? Họ sẽ gặp vấn đề rồi. Giải pháp này không phải là sạch trong tất cả các ý kiến của tôi. – flxapps
không có bạn có thể thử điều này bởi vì nếu u sẽ cung cấp cho textcolor trắng rõ ràng, nó sẽ ghi đè lên bất kỳ màu sắc mặc định của chủ đề. –
Bạn không hiểu. Một số người dùng Android có ROM tùy chỉnh và một số ROM tùy chỉnh theo chủ đề riêng. Và một số chủ đề riêng lẻ có thể có màu sắc rất sáng. Và một số trong những chủ đề màu sắc tươi sáng này có thể có hình nền hộp thoại sáng. Và những chủ đề có nền hộp thoại tươi sáng sẽ hợp lý sử dụng màu văn bản tối để làm cho văn bản hội thoại có thể đọc được. Và nếu tôi ghi đè màu văn bản này bằng màu trắng, sẽ có văn bản màu trắng hiển thị trên nền sáng. Bạn có thể đọc văn bản màu trắng trên nền trắng không? Tôi không nghĩ vậy ... – flxapps