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

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

alert.setTitle( Html.fromHtml("Set IP Address")); 

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

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

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

К сожалению, это не очень простая задача. В моем ответе здесь я подробно 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

      

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

Это установит цвет для названия, значка и разделителя. Связано для изменения с любой новой версией 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 генерируется в classе 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

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

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

  >  

Если вы используете пользовательский макет заголовка, вы можете использовать его как 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         

Продолжая этот ответ: 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. * 

* 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 */ public static 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); } }}

В classе onCreateView я помещаю это:

 Dialog d = getDialog(); d.setTitle(Html.fromHtml("About")); 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 способ установить цвет заголовка.

Вместо использования разделителя в диалоговом окне используйте представление в пользовательском макете и установите макет в качестве настраиваемого макета в диалоговом окне.

custom_popup.xml:

         1         

activity.java:

 public void showPopUp(String title, String text) { LayoutInflater inflater = getLayoutInflater(); View alertLayout = inflater.inflate(R.layout.custom_popup, null); TextView txtContent = alertLayout.findViewById(R.id.txtPopup); txtContent.setText(text); TextView txtTitle = alertLayout.findViewById(R.id.txtTitle); txtTitle.setText(title); AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setView(alertLayout); alert.setCancelable(true); alert.setPositiveButton("Done", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); AlertDialog dialog = alert.create(); dialog.show(); } 

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

 requestWindowFeature(Window.FEATURE_NO_TITLE); 
  ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLACK); String title = context.getString(R.string.agreement_popup_message); SpannableStringBuilder ssBuilder = new SpannableStringBuilder(title); ssBuilder.setSpan( foregroundColorSpan, 0, title.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ); AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder(context); alertDialogBuilderUserInput.setTitle(ssBuilder) 
  • Существует ли типичный шаблон реализации государственного аппарата?
  • WCF - Решение о параметрах проектирования
  • Эта активность уже имеет панель действий, предоставляемую декором windows
  • Каким должен быть цвет Ripple, colorPrimary или colorAccent? (Дизайн материалов)
  • Почему «final» не допускается в методах интерфейса Java 8?
  • Крупномасштабный дизайн в Haskell?
  • TextInputLayout не показывает подсказку EditText перед тем, как пользователь сосредоточится на ней
  • Как отличаются параметры прокси, декоратора, адаптера и моста?
  • Откуда вы знаете, когда использовать шаблоны дизайна?
  • Как изменить новый цвет и высоту индикатора TabLayout
  • Фабричный, абстрактный заводский и заводской метод
  • Давайте будем гением компьютера.