android 设置系统dialog 样式

简介: android 设置系统dialog 样式

1、编写一个文本样式。

 DIALOG的标题是一个textview,在sytles.xml中,添加如下代码来设置你自己的文本样式:

 ?


</div><div>  <item name="android:textSize">22sp</item></div><div>  <item name="android:textColor">@color/font_dark_grey</item></div><div>  

 2、设置对话框的标题主题。

 

 上面的标题文本并不能直接设置为对话框的标题样式。 我们还需要编写一个表示标题的主题的style,在这里指定标题的文本样式。代码如下:

 

 ?


</div><div>  <item name="android:maxLines">1</item></div><div>  <item name="android:scrollHorizontally">true</item></div><div>  <item name="android:textAppearance">@style/DialogWindowTitle</item></div><div>  


 3、设置对话框主题。

 

 接下来,我们编写我们的对话框主题,在这里指定标题的主题。由于一些属性并不是public的,所以我们需要继承自原来的某个style,代码如下:

 

 ?


 

</div><div>  <item name="android:windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item></div><div>  


 4、自定义App的主题。

 

 接下来,我们需要在我们的App theme中指定我们的对话框使用这种主题,所以需要定义一个App theme。同样由于App theme的许多属性并不是public的(比如下面要提到的标题下面的那条蓝线),所以我们要继承自一个原生的style。这里我根据程序需要选择了Theme.Holo.Light.NoActionBar,代码如下:

 

 ?


</div><div>  <item name="android:dialogTheme">@style/Theme.DeviceDefault.Dialog</item></div><div>  

 5、指定App主题。

 

 最后一步,我们需要在AndroidManifest.xml文件中,指定我们的app主题。这步很简单,只需要在application标签中指定android:theme的值即可,如下:

 

 ?


 android:theme="@style/ParkingTheme"


 不过这只是指定了Dialog的主题。如果是通过AlertDialog创建出来的对话框,主题还是原来的。所以我们还需要以下步骤。

 

 7、编写AlertDialog主题。

 我们无法直接继承系统主题里的AlertDialog的style。如把parent指定为Theme.DeviceDefault.Dialog.Alert,Theme.Holo.Dialog.Alert,Theme.DeviceDefault.Light.Dialog.Alert或Theme.Holo.Light.Dialog.Alert,都会导致编译不过。所以我们需要继承自Dialog的style。在这里我以Theme.Holo.Light.Dialog为例,代码如下:


 

</div><div>  <item name="android:windowBackground">@android:color/transparent</item></div><div>  <item name="android:windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item></div><div>  <item name="android:windowContentOverlay">@null</item></div><div>  <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item></div><div>  <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item></div><div>  


 在这里我参考了原生的alertDialog的style,设定了窗口背景为透明,以及windowContentOverlay为null这两个重要属性,否则你会看到在AlertDialog下面还有一层对话框的背景,或者是对话框的背景遮住了所有内容这样的问题存在。

 


 8、指定AlertDialog的主题。


 我们需要在第4步所说的自定义的AppTheme中,添加一行代码来指定要使用的AlertDialog的style,代码如下:


 ?

 @style/Theme.DeviceDefault.Dialog.Alert


 9、修改标题下面的蓝色线。

 

 如果你修改了对话框的主题颜色,那么标题下面的蓝色的线肯定会让你很郁闷。如果对话框较少,你可以选择隐藏标题,然后自定义一个包含了标题的View来设置为对话框的内容。但是如果你的对话框有许多种,而且本来都是可以调用原来的API就来生成的话,要去定义这么多个带标题的view,这样做下来心里肯定是很纠结的。


 标题下面的蓝色的线,并不是在Dialog或AlertDialog中设置或通过它们的style中定义的。它是定义在各种风格的dialog的layout当中,然后再在AppTheme里面指定dialog的对应属性。遗憾的是,目前我看到这几个相关属性还不是public的,不能自己设置,所以只有通过Java代码来实现了。


 表示这条蓝色的线的叫做titleDivider,我们可以通过getResources()的API来获取它的IP,然后设置颜色。代码如下:


 ?

  public static final void dialogTitleLineColor(Dialog dialog, int color) {undefined

 Context context = dialog.getContext();

 int divierId = context.getResources().getIdentifier("android:id/titleDivider", null, null);

 View divider = dialog.findViewById(divierId);

 divider.setBackgroundColor(color);

 }


 这行代码对于自定义的Dialog,可以在setContentView之后调用。但是对于AlertDialog,必须在show()方法被调用之后才可以去调用,否则会报错。


附 修改  标题和线 颜色 方法  里面的color自己定义

//修改默认AlertDialog的标题颜色 和 下面蓝色线的颜色
   public static void dialogTitleLineColor(Dialog dialog,Context context) {
     //获取标题textView 并设置颜色
     try {
       Field mAlert = AlertDialog.class.getDeclaredField("mAlert");  
       mAlert.setAccessible(true);  
         Object alertController = mAlert.get(dialog);  
         Field mTitleView = alertController.getClass().getDeclaredField("mTitleView");  
         mTitleView.setAccessible(true);  
         TextView title = (TextView) mTitleView.get(alertController);
         title.setTextColor(context.getResources().getColor(R.color.country_standard_defaulg));
    } catch (Exception e) {
    }
     //获取下面线对象view 并设置颜色
     int divierId = context.getResources().getIdentifier("android:id/titleDivider", null, null);
     View divider = dialog.findViewById(divierId);
     divider.setBackgroundColor(context.getResources().getColor(R.color.country_standard_defaulg));
   }


相关文章
|
4天前
|
算法 JavaScript Android开发
|
6天前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
19 2
|
5天前
|
安全 搜索推荐 程序员
深入探索Android系统的碎片化问题及其解决方案
在移动操作系统的世界中,Android以其开放性和灵活性赢得了广泛的市场份额。然而,这种开放性也带来了一个众所周知的问题——系统碎片化。本文旨在探讨Android系统碎片化的现状、成因以及可能的解决方案,为开发者和用户提供一种全新的视角来理解这一现象。通过分析不同版本的Android系统分布、硬件多样性以及更新机制的影响,我们提出了一系列针对性的策略,旨在减少碎片化带来的影响,提升用户体验。
|
5天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
Java Android开发 Kotlin
Android 自定义加载动画Dialog弹窗
Android 自定义加载动画Dialog弹窗
338 0
Android 自定义加载动画Dialog弹窗
|
XML Android开发 数据格式
Android自定义Dialog以控制其位置和宽高
Android自定义Dialog以控制其位置和宽高
473 0
|
Android开发
android自定义相对复杂dialog
之前写了两篇关于Dialog的算是文章吧(2333),分别是: 1、 Android 系统原生dialog使用 2、 Android dialog Activity 使用 下面开始第三篇:相对复杂的自定义dialog。
1124 0
|
Android开发 数据格式 XML