1. 样式化常见组件
在开发过程中,常常会遇到很多一致的外观和效果,通常可以在布局文件中使用一些抽取的一些公用的style,
color之类的样式,减少重复代码量。
样式指的是视图自定义属性的集合,比如文本大小或背景色,通过将相同的属性抽象化到样式中,可以大大的
提高代码的更新和维护。
Android还支持将多个样式共同分组到主题的全局元素中。主题被应用于整个上下文,并且定义了应适用于该
上下文中所有视图的样式。
通常,应用中程序启动的每个Activity都应用了一个主题。
比如: xml中抽取的样式
<style name="textview_14sp">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:clickable">true</item>
<item name="android:text">@string/default_value</item>
<item name="android:textColor">@color/color_111111</item>
<item name="android:textSize">@dimen/sp_14</item>
</style>
显示或隐式的父样式声明
样式继承有显示隐式之分。 、
显式声明父样式:
<style name="BaseStyle" />
<style name="NewStyle" parent="BaseStyle"/>
NewStyle是BaseStyle的扩展,包含在父样式中定义的所有属性。
隐式声明父样式(实际开发中没怎么用过):
<style name="BaseStyle"/>
<style name="BaseStyle.Extended"/>
BaseStyle.Extended以相同的方式从BaseStyle继承其属性。两者效果一样,只是更加简洁,实际开发中,两种形式不建议混用。
主题(Theme)
主题就是一种应用到整个应用程序中或某个Activity的外观风格,换句话说,就是应用范围更广的风格样式
,也是在styles.xml中定义的。使用主题通常有两个选择,使用系统主题或创建自定义主题。无论采用哪种方式
,都要在AndroidManifest.xml文件中设置主题。
Paste_Image.png
- 1 系统主题
常见的几个示例:- Theme.Light: 标准主题的变体,该主题的背景和用户元素使用的相反的颜色主题。它是Android3.0以前版本的应用程序默认推荐使用的基础主题。
- Theme.NoTitleBar.FullScreen: 移除标题栏和状态栏,全屏显示(去掉屏幕上所有的组件)
- Theme.Dialog: 让Activity看起来更像对话框的用户主题。
- Theme.Holo.Light: (API Level 11)使用逆配色方案的主题并默认拥有一个ActionBar。这是Android3.0上应用程序默认推荐的主题。
- Theme.Holo.Light.DarkActionBar: (API Level 14) 使用的逆配色方案的主题,但ActionBar是黑色实线的。这是Android4.0上应用程序默认推荐的基本主题。
- Theme.Material.Light:(API Level 21) 通过小型的原色调色板控制的简化颜色方案主题。此主题还支持使用提供的原色对标准小部件着色。这是Andrroid5.0上应用程序默认推荐的主题。
- 2 自定义主题
通过res/values下styles.xml文件,与窗口自定义有关的主题元素可以在SDK的R.attr引用中找到,下面是常用的一些元素:- android:windowNoTitle :控制是否要移除默认的标题栏;设置为true以移除标题栏。
- android:windowFullscreen: 控制是否移除系统状态栏;设为true以移除状态栏并全屏显示.
- android:windowBackground: 将某个颜色或Drawable资源设为背景.
- android:windowContentOverlay:窗口内容的前景之上放置的Drawable资源.默认情况下,就是状态栏下的阴影;可以用任何资源代替默认的状态栏,或者设为null(XML中为@null)以将其移除.
- android:colorPrimary:用于对主要的界面元素着色,如Action Bar和滚动边界发光特效.同样也影响最近对标题栏颜色的操作.
- android:colorPrimaryDark:对系统控件着色,如状态栏的背景.
- android:colorAccent:应用于拥有焦点或已激活控件的默认颜色.
- android:colorControlNormal:重写没有焦点或未激活控件的颜色.
- android:colorControlActivated:重写拥有焦点或已激活控件的颜色.如果同时定义了强调色,则替换改颜色.
- android:colorControlHighlight:重写正在按下的控件的颜色.
2.几个常见的切换系统UI的代码片段(Android4.0中引入的)
2.1 夜间模式
夜间模式通常也称为"熄灯模式",指的是调暗屏幕导航控件,而不是真正移除它们来减少屏幕上的系统元素.
Paste_Image.png
2.2 隐藏导航控件
SYSTEM_UI_FLAG_HIDE_NAVIGATION标识会移除没有物理按钮的设备屏幕上的HOME和BACK控件.
Paste_Image.png
2.3 全屏UI模式
Android4.1之前是没有方法动态地隐藏系统状态栏的,只能通过设置静态的主题来实现. 在隐藏和显示
Action Bar时,ActionBar.show() 和 ActionBar.hide()会动态地显示和隐藏Action Bar元素. 如果请求的
是FEATURE_ACTION_BAR_OVERLAY,页面的变化将不会影响到Activity的内容;否则,视图的内容会上下移动来适
应这种变化.
Paste_Image.png
与只隐藏导航控件的示例类似,我们不需要再次显示控件,因为任何屏幕上的点击都会让他们再次显示出来.作为
Android4.1的一个便捷之处,在系统通过这种方式清除SYSTEM_UI_FLAG_HIDE_NAVIGATION后,同时会清除
SYSTEM_UI_FLAG_FULLSCREEN标识,所以顶部和底部会一起可见.如果我们请求了
FEATURE_ACTION_BAR_OVERLAY,Android会隐藏作为全屏标识一部分的Action Bar; 否则只会影响到状态栏.
SYSTEM_UI_FLAG_LAYOUT_STABLE,这个标识会通知Android在添加和移除系统UI时不要移动我们的内容视图.