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


相关文章
|
14天前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
31 0
|
7天前
|
Android开发
Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
本文介绍了 `SpannableString` 在 Android 开发中的强大功能,包括如何在单个字符串中应用多种样式,如颜色、字体大小、风格等,并提供了详细代码示例,展示如何设置文本颜色、添加点击事件等,助你实现丰富文本效果。
43 3
|
8天前
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
19 1
|
11天前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
60 0
|
13天前
|
安全 Android开发 iOS开发
安卓与iOS的终极对决:哪个系统更适合你?
在智能手机的世界里,安卓和iOS两大操作系统如同两座巍峨的山峰,各自拥有庞大的用户群体。本文将深入浅出地探讨这两个系统的优缺点,并帮助你找到最适合自己的那一款。让我们一起揭开这场技术盛宴的序幕吧!
|
Java 调度 Android开发
android体系课-系统启动流程-之zygote进程启动过程源码分析
笔者刚开始学习Android的时候也和大部分同学一样,只会使用一些应用层面的知识,对于一些比较常见的开源框架如<mark>RxJava</mark>,<mark>OkHttp</mark>,<mark>Retrofit</mark>,以及后来谷歌推出的<mark>协程</mark>等,都只在使用层面,对于他们<mark>内部原理</mark>,基本没有去了解觉得够用就可以了,又比如Activity,Service等四大组件的使用原理,系统开机过程,Launcher启动过程等知之甚少,知其然而不知其所以然,结果就是出现某些问题,不知道从哪里找原因,只能依赖万能的百度,但是百度看多了,你会发现自己
|
Java 调度 Android开发
android体系课-系统启动流程-之SystemServer启动过程源码分析
笔者刚开始学习Android的时候也和大部分同学一样,只会使用一些应用层面的知识,对于一些比较常见的开源框架如<mark>RxJava</mark>,<mark>OkHttp</mark>,<mark>Retrofit</mark>,以及后来谷歌推出的<mark>协程</mark>等,都只在使用层面,对于他们<mark>内部原理</mark>,基本没有去了解觉得够用就可以了,又比如Activity,Service等四大组件的使用原理,系统开机过程,Launcher启动过程等知之甚少,知其然而不知其所以然,结果就是出现某些问题,不知道从哪里找原因,只能依赖万能的百度,但是百度看多了,你会发现自己