Как изменить цвет заголовка AlertDialog и цвет строки под ним

Я изменил цвет названия AlertDialog, используя эту команду

alert.setTitle( Html.fromHtml("<font color='#FF7F27'>Set IP Address</font>")); 

Но я хочу изменить цвет строки, которая появляется под заголовком; Как мне это сделать ?

Примечание. Я не хочу использовать настраиваемый макет.

Скриншот желаемого эффекта

К сожалению, это не очень простая задача. В моем ответе здесь я подробно ListSeparator как настроить цвет ListSeparator , просто проверив родительский стиль, используемый Android, создав новое изображение и создав новый стиль на основе оригинала. К сожалению, в отличие от стиля AlertDialog темы AlertDialog являются внутренними и поэтому не могут быть указаны как родительские стили. Нет простого способа изменить эту маленькую синюю линию! Таким образом, вам нужно прибегнуть к созданию настраиваемых диалогов.

Если это просто не твоя чашка чая … не сдавайся! Я был очень обеспокоен тем, что не было простого способа сделать это, поэтому я создал небольшой проект для github для создания быстро настраиваемых голографических диалогов (предполагая, что телефон поддерживает стиль Holo). Проект можно найти здесь: https://github.com/danoz73/QustomDialog

Это должно легко позволить перейти от скучного синего к захватывающему апельсину!

Введите описание изображения здесь

Проект в основном является примером использования настраиваемого диалогового построителя, и в этом примере я создал пользовательский вид, который, как представляется, удовлетворяет примеру IP-адреса, который вы задаете в своем исходном вопросе.

С помощью QustomDialog , чтобы создать базовый диалог (заголовок, сообщение) с желаемым разным цветом для заголовка или разделителя, вы используете следующий код:

 private String HALLOWEEN_ORANGE = "#FF7F27"; QustomDialogBuilder qustomDialogBuilder = new QustomDialogBuilder(v.getContext()). setTitle("Set IP Address"). setTitleColor(HALLOWEEN_ORANGE). setDividerColor(HALLOWEEN_ORANGE). setMessage("You are now entering the 10th dimension."); qustomDialogBuilder.show(); 

И чтобы добавить пользовательский макет (например, чтобы добавить небольшой IP-адрес EditText ), вы добавляете

 setCustomView(R.layout.example_ip_address_layout, v.getContext()) 

К строителю с макетом, который вы разработали (пример IP можно найти в github). Надеюсь, это поможет. Большое спасибо Джозефу Эрлу и его ответу здесь .

Цвет разделителя:

Это взломать немного, но он отлично работает для меня, и он работает без какой-либо внешней библиотеки (по крайней мере, на Android 4.4).

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.dialog) .setIcon(R.drawable.ic) .setMessage(R.string.dialog_msg); //The tricky part Dialog d = builder.show(); int dividerId = d.getContext().getResources().getIdentifier("android:id/titleDivider", null, null); View divider = d.findViewById(dividerId); divider.setBackgroundColor(getResources().getColor(R.color.my_color)); 

Вы можете найти больше идентификаторов диалога в файле alert_dialog.xml . Например. android:id/alertTitle для изменения цвета заголовка …

ОБНОВЛЕНИЕ: цвет заголовка

Взлом для изменения цвета заголовка:

 int textViewId = d.getContext().getResources().getIdentifier("android:id/alertTitle", null, null); TextView tv = (TextView) d.findViewById(textViewId); tv.setTextColor(getResources().getColor(R.color.my_color)); 

Проверьте, что это полезно для вас …

 public void setCustomTitle (View customTitleView) 

Вы получите подробную информацию по следующей ссылке.

http://developer.android.com/reference/android/app/AlertDialog.Builder.html#setCustomTitle%28android.view.View%29

CustomDialog.java

 Dialog alert = new Dialog(this); alert.requestWindowFeature(Window.FEATURE_NO_TITLE); alert.setContentView(R.layout.title); TextView msg = (TextView)alert.findViewById(R.id.textView1); msg.setText("Hello Friends.\nIP address : 111.111.1.111"); alert.show(); 

title.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Set IP address" android:textColor="#ff0000" android:textAppearance="?android:attr/textAppearanceLarge" /> <ImageView android:layout_width="fill_parent" android:layout_height="2dp" android:layout_marginTop="5dp" android:background="#00ff00" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#775500" android:textAppearance="?android:attr/textAppearanceLarge" /> 

Введите описание изображения здесь

Это установит цвет для названия, значка и разделителя. Связано для изменения с любой новой версией Android.

 public static void colorAlertDialogTitle(AlertDialog dialog, int color) { int dividerId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider", null, null); if (dividerId != 0) { View divider = dialog.findViewById(dividerId); divider.setBackgroundColor(color); } int textViewId = dialog.getContext().getResources().getIdentifier("android:id/alertTitle", null, null); if (textViewId != 0) { TextView tv = (TextView) dialog.findViewById(textViewId); tv.setTextColor(color); } int iconId = dialog.getContext().getResources().getIdentifier("android:id/icon", null, null); if (iconId != 0) { ImageView icon = (ImageView) dialog.findViewById(iconId); icon.setColorFilter(color); } } 

Не забудьте вызвать dialog.show () перед вызовом этого метода.

Следуя исходному коду Dialog , я обнаружил, что Title генерируется в классе MidWindow путем раздувания макета dialog_title_holo.xml . Поэтому идентификатор mTitleView – это title а идентификатор разделителя – titleDivider .

Мы можем получить доступ к Идентификатору title просто с помощью android.R.id.title .

И доступ к идентификатору titleDivider из Resources.getSystem().getIdentifier("titleDivider","id", "android");

Конечный код, который я использовал для изменения направления заголовка и изменения цвета:

 TextView mTitle = (TextView)findViewById(android.R.id.title); mTitle.setGravity(Gravity.RIGHT|Gravity.CENTER_VERTICAL); int x = Resources.getSystem().getIdentifier("titleDivider","id", "android"); View titleDivider = findViewById(x); titleDivider.setBackgroundColor(getContext().getResources().getColor(R.color.some_color)); 

Если вам не нужна «библиотека» для этого, вы можете использовать этот плохой хак:

 ((ViewGroup)((ViewGroup)getDialog().getWindow().getDecorView()).getChildAt(0)) //ie LinearLayout containing all the dialog (title, titleDivider, content) .getChildAt(1) // ie the view titleDivider .setBackgroundColor(getResources().getColor(R.color.yourBeautifulColor)); 

Это было проверено и работает на 4.x; Не проверен, но если моя память хорошая, она должна работать на 2.x и 3.x

Если вы создаете настраиваемый диалог «Макет для предупреждения»

То вы можете легко добавить такой способ, чтобы изменить цвет

 <LinearLayout android:id="@+id/DialogTitleBorder" android:layout_width="fill_parent" android:layout_height="1dip" android:layout_below="@id/mExitDialogDesc" android:background="#4BBAE3" <!--change color easily --> > </LinearLayout> 

Если вы используете пользовательский макет заголовка, вы можете использовать его как alertDialog.setCustomTitle (customTitle);

Например

 on UI thread used dialog like LayoutInflater inflater=LayoutInflater.from(getApplicationContext()); View customTitle=inflater.inflate(R.layout.customtitlebar, null); AlertDialog.Builder d=new AlertDialog.Builder(this); d.setCustomTitle(customTitle); d.setMessage("Message"); d.setNeutralButton("OK", null); d.show(); customtitlebar.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:background="#525f67"> <ImageView android:id="@+id/icon" android:layout_width="40dp" android:layout_height="40dp" android:src="@drawable/ic_launcher" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" > </ImageView> <TextView android:id="@+id/customtitlebar" android:layout_width="match_parent" android:layout_height="40dp" android:textColor="#ffffff" android:text="Title Name" android:padding="3px" android:textStyle="bold" android:layout_toRightOf="@id/icon" android:layout_alignParentTop="true" android:gravity="center_vertical"/> <ImageView android:layout_width="match_parent" android:layout_height="2dp" android:background="#ff0000" android:layout_below="@id/icon"><!-- This is line below the title --> </ImageView> </RelativeLayout> 

Если вы используете расширение диалога, используйте:

requestWindowFeature (Window.FEATURE_NO_TITLE);

Продолжая этот ответ: https://stackoverflow.com/a/15285514/1865860 , я разветвил хороший репортаж github от @ daniel-smith и сделал некоторые улучшения:

  • Улучшенный пример Деятельность
  • Улучшенные макеты
  • Фиксированный метод setItems
  • Добавлены разделители в items_list
  • Отклонять диалоги при нажатии
  • Поддержка отключенных элементов в методах setItems
  • listItem сенсорная обратная связь
  • Прокручиваемое диалоговое сообщение

Link: https://github.com/dentex/QustomDialog

Я придумал другое решение, которое обрабатывает стиль ваших диалогов в одном месте, и вам не нужно беспокоиться о том, когда вы его применяете – диалог показывается / не показан, что может вызвать ошибку (должен вызвать requestFocus или что-то в этом роде; П).

Пример использования:

 AlertDialog.Builder builder = new AlertDialog.Builder(context); AlertDialog dialog = builder.create(); //or builder.show() DialogViewDecorator.decorate(dialog, android.R.color.holo_red_light); //can also set the defaut color in the class 

Реализация:

 public class DialogViewDecorator { private static final @ColorRes int DEFAULT_TITLE_DIVIDER_COLOR = android.R.color.holo_orange_light; public static void decorate(Dialog dialog) { decorate(dialog, DEFAULT_TITLE_DIVIDER_COLOR); } /** * Sets the title divider color when the view is shown by setting DialogInterface.OnShowListener on the dialog. * <p/> * If you want to do other things onShow be sure to extend OnDecoratedDialogShownListener(call super.show(...)!) * and call {@link #decorate(Dialog, int, OnDecoratedDialogShownListener)}. * * @param dialog * @param titleDividerColor */ public static void decorate(Dialog dialog, final int titleDividerColor) { decorate(dialog, titleDividerColor, new OnDecoratedDialogShownListener(titleDividerColor)); } /** * Method for setting a extended implementation of OnDecoratedDialogShownListener. Don't forget to call super * or the titleDividerColor wont be applied! * * @param dialog * @param titleDividerColor * @param OnShowListener * @param <T> */ public static <T extends OnDecoratedDialogShownListener> void decorate(Dialog dialog, int titleDividerColor, T OnShowListener) { if (dialog == null || titleDividerColor <= 0) { return; } if (dialog.isShowing()) { setTitleDividerColor(dialog, titleDividerColor); } else { dialog.setOnShowListener(OnShowListener); } } private static void setTitleDividerColor(DialogInterface dialogInterface, int titleDividerColor) { try { Dialog dialog = (Dialog) dialogInterface; int dividerId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider", null, null); View divider = dialog.findViewById(dividerId); if (divider != null) { divider.setBackgroundColor(dialog.getContext().getResources().getColor(titleDividerColor)); } } catch (Exception e) { e.printStackTrace(); } } public static class OnDecoratedDialogShownListener implements DialogInterface.OnShowListener { private int titleDividerColor; public OnDecoratedDialogShownListener() { this.titleDividerColor = DEFAULT_TITLE_DIVIDER_COLOR; } public OnDecoratedDialogShownListener(int titleDividerColor) { this.titleDividerColor = titleDividerColor; } @Override public void onShow(DialogInterface dialogInterface) { setTitleDividerColor(dialogInterface, titleDividerColor); } }} 

В классе onCreateView я помещаю это:

 Dialog d = getDialog(); d.setTitle(Html.fromHtml("<font color='#EC407A'>About</font>")); int dividerId = d.getContext().getResources().getIdentifier("android:id/titleDivider", null, null); View divider = d.findViewById(dividerId); divider.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); 

ColorPrimary ссылки на наш файл colors.xml, который хранит все цвета. Также d.setTitle предоставляет d.setTitle способ установить цвет заголовка.