Правильный цвет текста / внешний вид в AlertDialog

Я очень долго борюсь с этой проблемой. Я искал решения, и на самом деле были некоторые предложения по смежным проблемам, но для меня ничего не получилось. Итак, допустим, я хочу создать 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(); 

Это не сработает , потому что если сообщение диалога становится слишком длинным, флажок не будет отображаться полностью. Кроме того, он будет полностью скрыт в ландшафтном режиме.

Следующая попытка – найти исходный файл макета диалогового окна (для меня он находится под android-sdk-linux_86 / platform / android-17 / data / res / layout / alert_dialog.xml) и попытаться скопировать соответствующую часть, чтобы создать нашу Собственный «клон» внутреннего диалогового макета, как это:

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> 

Мы могли бы попытаться добавить это представление в наш диалог следующим образом:

 // 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(); 

Это действительно работает очень хорошо. Почти. Мы не увидим никаких проблем, пока не будем использовать Theme.Light для нашего приложения. Но как только мы будем использовать Theme.Light, цвета диалогового текста станут черными и нечитабельными на темном фоне. ЗАЧЕМ?!

  • Мы клонировали исходный код исходного кода диалогового окна Android alert. Но хотя мы используем attr / textAppearanceMedium как текстовый стиль, цвет текста становится черным в разделе Theme.Light в любом случае.
  • Если мы используем Theme.Light и создаем «нормальный» диалог с обычным сообщением через setMessage, цвет текста является белым и читаемым.

Что не так? Как это решить? Я не хочу программно устанавливать цвет текста на белый или черный, это не будет хорошо выглядеть в пользовательских тем. Какие-либо предложения?

Solutions Collecting From Web of "Правильный цвет текста / внешний вид в AlertDialog"

У меня была такая же проблема и она была решена, создав ContextThemeWrapper для моей желаемой темы диалога и использовал ее при создании AlertDialog Builder и при раздувании View to attach:

 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); 

Стиль R.style.DialogBaseTheme определен в «/values/styles.xml» для Gingerbread и ниже как:

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

Затем он также определен в «/values-v11/styles.xml» для Honeycomb и вверх для использования темы Holo:

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

Так что на Gingerbread мои пользовательские ViewView TextViews автоматически окрашены в белый цвет, а Honeycomb + автоматически окрашиваются в черный цвет для Holo Light.

Я ДУМАЮ, что я наконец выяснил, как его решить. Исходя из моего исходного кода, это, похоже, решает мою проблему:

 // 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); 

Обратите внимание на ContextThemeWrapper. Это делает тему диалога назначенной для раздутого макета. Надеюсь, это окончательно решает эту проблему на будущее.

Только внутри textview добавьте один атрибут:

 android:textColor="@color/white" 

И определите белый цвет внутри colors.xml, который находится внутри папки res / values

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

Или вы можете добавить напрямую

android:textColor="#fffff" (хотя и не рекомендуется. Рекомендуется использовать этот метод).

Вы можете применить собственный стиль с тенью, чтобы сделать ваш текст видимым, независимо от цвета текста:

 <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> 

Однако, если этого недостаточно для вас, вы можете применить внутреннюю тень, но, к сожалению, у Android нет для этого свойства, поэтому вам придется использовать что-то вроде MagicTextView (упомянутое ABentSpoon в этом вопросе: есть ли способ Добавить внутреннюю тень в TextView на Android? ).