我怎样才能改变AlertDialog标题的颜色和它下面的线的颜色

我用这个命令改变了AlertDialog标题的颜色

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

但是我想改变标题下出现的那一行的颜色, 我怎样才能做到这一点 ?

注意:我不想使用自定义布局

所需效果的截图

不幸的是,这不是一个特别简单的任务。 在我的答案中 ,我详细地介绍了如何通过检查Android使用的父types,创build一个新的图像,并基于原始创build新的样式来调整ListSeparator的颜色。 不幸的是,与ListSeparator的风格不同, AlertDialog主题是内部的,因此不能被引用为父types。 有没有简单的方法来改变这个小蓝线! 因此,你需要采取自定义对话框。

如果那不是你的一杯茶… 不要放弃! 我感到非常不安,因为没有简单的方法可以做到这一点,所以我在github上build立了一个小程序,用于快速定制全息对话框(假设手机支持全息样式)。 你可以在这里find这个项目: https : //github.com/danoz73/QustomDialog

它应该很容易使无聊的蓝色从令人兴奋的橙色!

在这里输入图像描述

该项目基本上是一个使用自定义对话框生成器的例子,在这个例子中,我创build了一个自定义视图,似乎迎合了你在原始问题中给出的IP地址例子。

使用QustomDialog ,为了创build标题或分隔符所需的不同颜色的基本对话框(标题,消息),请使用以下代码:

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

给devise者的布局(IP示例可以在github中find)。 我希望这有帮助。 非常感谢Joseph Earl和他的回答 。

分隔线颜色:

这是一个黑客,但它对我很好,它没有任何外部库(至less在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文件中find更多对话框的ID。 例如。 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源代码 ,我发现在MidWindow类中通过膨胀dialog_title_holo.xml布局来生成标题。 所以mTitleView的标识是title ,divider的标识是titleDivider

我们只需通过android.R.id.title即可访问title Id。

并通过Resources.getSystem().getIdentifier("titleDivider","id", "android");获得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)); 

这是testing和工作4.x; 没有经过testing,但如果我的记忆是好的,它应该为2.x和3.x工作

如果您正在创build自定义布局警报对话框

那么你可以很容易地添加这样的方式来改变颜色

 <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 ,我从@ daniel-smith分叉好github回购,并做了一些改进:

  • 改进的示例活动
  • 改进布局
  • 固定的setItems方法
  • items_list添加分隔items_list
  • closures点击对话框
  • 支持setItems方法中的禁用项目
  • listItem触摸反馈
  • 可滚动的对话框消息

链接: https : //github.com/dentex/QustomDialog

我想出了另一个解决scheme,在一个地方处理对话框样式,你不必担心什么时候应用它 – 对话框显示/不显示,这可能会导致错误(应该调用requestFocus或类似的东西; P)。

用法示例:

 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提供了一个黑客的方式来设置标题颜色。