2012-12-25 36 views
8

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?

Trả lời

0

Chỉ cần bên trong TextView thêm một thuộc tính:

android:textColor="@color/white" 

và xác định màu trắng bên trong colors.xml đó là bên trong res/values ​​thư mục

<color name="white">#ffffff</color> 

Hoặc bạn có thể thêm trực tiếp

android:textColor="#fffff" (mặc dù không được đề xuất. Phương pháp trên được khuyến nghị.)

+0

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

+0

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ủ đề. –

+0

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

0

Bạn có thể áp dụng một kiểu tùy chỉnh với một bóng để làm cho văn bản của bạn có thể nhìn thấy bất cứ điều gì màu sắc văn bản là:

<resources> 
<style name="Text.Shaded.Medium" parent="@android:attr/textAppearanceMedium"> 
    <item name="@android:paddingLeft">4dp</item> 
    <item name="@android:paddingBottom">4dp</item> 
    <item name="@android:textColor">#FFFFFFFF</item> 
    <item name="@android:shadowColor">#000000</item> 
    <item name="@android:shadowDx">2</item> 
    <item name="@android:shadowDy">2</item> 
    <item name="@android:shadowRadius">2</item> 
</style> 
</resources> 

Tuy nhiên nếu nó không phải là đủ rõ ràng cho bạn, bạn có thể áp dụng một bóng bên trong, nhưng tiếc là Android không có một tài sản cho rằng vì vậy bạn sẽ phải sử dụng một cái gì đó như MagicTextView (được đề cập bởi ABentSpoon trong câu hỏi này: Is there a way to add inner shadow to a TextView on Android?).

+1

Giải pháp này cũng lộn xộn xung quanh với giao diện hộp thoại mặc định. Nó làm cho hộp thoại xuất hiện vô giá và lạ đối với người dùng. Tôi không thích một giải pháp như vậy. – flxapps

1

I THINK Cuối cùng tôi đã tìm ra cách giải quyết. Trên cơ sở mã ban đầu của tôi, điều này dường như giải quyết được vấn đề của tôi:

// add checkbox layout 
LinearLayout checkboxLayout = (LinearLayout) View.inflate(new ContextThemeWrapper(context, android.R.style.Theme_Dialog), R.layout.dialog_checkbox, null); 
((TextView) checkboxLayout.findViewById(R.id.message)).setText(DIALOG_TEXT); 
mCheckbox = (CheckBox) checkboxLayout.findViewById(R.id.checkbox); 
mCheckbox.setText(CHECKBOX_NOT_AGAIN); 
setView(checkboxLayout); 

Lưu ý ContextThemeWrapper. Nó làm cho chủ đề hộp thoại được gán cho bố cục tăng cao. Tôi hy vọng, điều này cuối cùng sẽ giải quyết vấn đề đó cho tương lai.

+0

Không. Có vẻ như nó không hoạt động trên Android 4 ... Chết tiệt. Bất cứ ai có thể xin vui lòng tìm một giải pháp thích hợp? – flxapps

19

tôi đã cùng một vấn đề và giải quyết nó bằng cách tạo ra một ContextThemeWrapper cho tôi Theme Dialog mong muốn và sử dụng này khi tạo AlertDialog Builder và khi lạm phát View để đính kèm:

ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DialogBaseTheme); 
AlertDialog.Builder builder = new AlertDialog.Builder(wrapper); 
View view = LayoutInflater.from(wrapper).inflate(R.layout.create_warning, null); 
builder.setView(view); 

Phong cách R.style. DialogBaseTheme được định nghĩa trong "/values/styles.xml" cho Gingerbread và dưới như:

<style name="DialogBaseTheme" parent="android:Theme.Dialog"/> 

sau đó, nó cũng được định nghĩa trong "/values-v11/styles.xml" cho Honeycomb và trở lên để sử dụng các chủ đề Holo như:

<style name="DialogBaseTheme" parent="android:Theme.Holo.Light.Dialog" /> 

Vì vậy, trên Gingerbread, TextView của View của tôi được tự động tô màu trắng và Honeycomb + chúng tự động có màu đen cho Holo Light.

+2

Tôi đã luôn luôn tự hỏi làm thế nào để làm điều này. Điều này hoạt động hoàn hảo. – nlawson

+0

Cảm ơn bạn rất nhiều vì câu trả lời này! Hoạt động hoàn hảo! –

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