apidemos里面展示的自定义窗口其实并不复杂,下面我们来看一下:
1、CustomDialogActivity和别的activity并没有区别
2、activity在项目AndroidManifest.xml配置文件中加入 android:Theme属性 例如示例:
<activity android:name=".app.activity.CustomDialogActivity" android:label="@string/app_activity_custom_dialog_lable" android:theme="@style/Theme.CustomDialog"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="com.angie.apidemos.SAMPLE_CODE" /> </intent-filter> </activity>
3、接下来就是创建theme Theme.CustomDialog。定义Theme 和定义Style 一样, 必须定义在/res/values 子目录下,
根元素名为resources,Theme 和Style 的区别在于Theme 应用于Activity 和Application 而 Style 应用于单个的View。
其定义方法是一致的。Style 定义支持 Inheritance, 也就是在定义新风格时可以基于系统定义的风格或是之前定义的风格: 如Theme.CustomDialog 定义就是基于Android 的Dialog 风格(parent)而只修改的WindowsBackground 属性,使用了褐色背景。
定义的theme如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.CustomDialog" parent="android:style/Theme.Dialog"> <item name="android:windowBackground">@drawable/app_activity_custom_dlg_filled_box</item> </style> </resources>
其中引用了drawable里面的xml文件 其定义的是具体的样式 例如:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#f0600000"/> <stroke android:width="3dp" color="#ffff8080"/> <corners android:radius="3dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape>
效果如如下:
样式是规定 VIew和window显示样式的集合. 样式可以指定的属性: height, padding, font color, font size, background color等等.在layout XML文件中我们经常见到下面的定义:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#00FF00" android:typeface="monospace" android:text="@string/hello" />
同样我们可以把textview的样式属性单独定义带CodeFont.xml中,在layout中引用如下:
<TextView style="@style/CodeFont" android:text="@string/hello" />
主题(theme)是应用到整个 Activity
或者 application的样式, 不是指单个view的样式定义. 如果将一个样式作为主题使用,那么在Activity或者application中得每一个view都会被主题样式影响。比如:CodeFont作为主题应用到Activity或者application,Activity或者application中得text都会变成green monospace font
定义Styles
styles的定义文件xml必须保存于 项目res/values/ 中,
并且文件的根节点必须是
<resources>,类似的定义如下
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CodeFont" parent="@android:style/TextAppearance.Medium"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#00FF00</item> <item name="android:typeface">monospace</item> </style> </resources>
注:theme的定义和style一样,主要是看你将其应用在view上还是activity或者application上;
同时style的定义支持继承,例如我们定义一个新的style继承自系统已有的style
<style name="GreenText" parent="@android:style/TextAppearance"> <item name="android:textColor">#00FF00</item> </style>
新的GreenText继承自系统已有style TextAppearance,只是修改了文字的颜色。
需要格外注意的是:我们继承系统已有style的时候使用了关键字parent,但是如果需要继承我们自己定义的style的时候就不能使用parent关键字了,sdk中介绍使用 点 举例说明:继承我们自己定义的CodeFont style
<style name="CodeFont.Red"> <item name="android:textColor">#FF0000</item> </style>
新的style在使用的时候可以直接使用:@style/CodeFont.Red. 我们可以继续继承新的style来定义style:
<style name="CodeFont.Red.Big"> <item name="android:textSize">30sp</item> </style>
新的style继承了CodeFont
和 CodeFont.Red
的所有属性,并且新定义的字体大小属性。
特别强调:这种使用小数点方式的继承机制只使用于自定义的资源,如果使用android内置的style或者theme必须使用关键字parent。
关于style properties建议参考sdk中每个view class 。里面有详细的说明该view支持的属性。
关于已定义的style引用详细清单请参考sdk中得R.attr。其中以window开头的引用只使用与主题(theme),不适用任何一个view。例如 windowBackground
等;
接下来我们举例说明style和theme的用法
1.view element
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#00FF00" android:typeface="monospace" android:text="@string/hello" />
2.view使用已有style
<TextView style="@style/CodeFont" android:text="@string/hello" />
3.将theme应用到activity或者application
<application android:theme="@style/CustomTheme">
<activity android:theme="@android:style/Theme.Dialog">
如果系统的theme并不完全适用于项目,可以像下面这个样子修改theme
<color name="custom_theme_color">#b0b0ff</color> <style name="CustomTheme" parent="android:Theme.Light"> <item name="android:windowBackground">@color/custom_theme_color</item> <item name="android:colorBackground">@color/custom_theme_color</item> </style>
然后再使用:
<activity android:theme="@style/CustomTheme">
Select a theme based on platform version
如果想根据不同的平台版本选择主题,加入我们想规定Android 3.0 (API Level 11)或者更高的版本的主题,则可以定义theme.xml 保存在/res/values-v11 文件夹内。
<style name="LightThemeSelector" parent="android:Theme.Holo.Light"> ... </style>
注意parent引用的时候使用的引用名称为全称。
至此我们简单的了解了android的style和theme 更多详细的内容大家还是参考sdk中得说明。谢谢