Android开发Theme和Style

在xml文件中,当多个控件需要设置相同的属性设置时,可以使用style来避免重复的代码,利于代码的维护:

Style属性

res/values/styles.xml

<resource>
	<style name="LabelText" parent="android:TextAppearance.Large">
		<item name="android:textStyle">bold</item>
		<item name="android:textSize">15dp</item>
	</style>

	<style name="FormButton" parent="android:Widget.Button">
		<item name="android:minWidth">@dimen/buttonWidth</item>
		<item name="android:background">@drawable/bg_btn</item>
		<item name="android:textColor=">@color/red</item>
	</style>

	<style name="FormRadioButton" parent="android:Widget.CompoundButton.RadioButton">
		<item name="android:minHeight">25dip</item>
		<item name="android:button">@null</item>
		<item name="android:background">@drawable/bg_radio</item>
		<item name="android:gravity">center</item>
	</style>

	<style name="FormCheckButton" parent="android:Widget.CompoundButton.CheckBox">
		<item name="android:mingWidth">23dp</item>
		<item name="android:minHeight">23dp</item>
		<item name="android:button">@null</item>
		<item name="android:gravity">center</item>
		<item name="android:textStyle">bold</item>
		<item name="android:textColor">@color/red</item>
	</style>
</resource>

在xml文件中使用styles.xml中的属性:

<Button
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	style="@style/FormButton" />

<TextView
	android:layout_height="wrap_content"
	android:layout_width="wrap_content"
	style="@style/LabelText"
	abdroid:textAppearance="@style/LabelText" />

<RadioButton
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	style="@style/FormRadioButton" />

【注意】

控件可以使用style引用自定义的style属性,但TextView有例外,它可以接受一个特殊的属性android:textAppearance,此属性获取一个样式引用,并且仅应用在文本格式化属性(大小,颜色,样式等),同样TextView依然可以通过style应用单独的样式属性。


Theme主题

在AndroidManifest.xml文件中对Application和Activity设置Theme(主题):

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  ....>
	<application android:theme="APPLICATION_THEME_NAME" ....>
		<activity android:theme="ACTIVITY_THEME_NAME" ....>
			<intent-filter>
				....
			</intent-filter>
		</activity>
	</application>
</manifest>

(1)系统主题

  • Theme.Light
  • Theme.NoTitleBar.Fullscreen:移除标题栏和状态栏,全屏显示
  • Theme.Dialog:让Activity以Dialog的方式显示
  • Theme.Holo.Light:默认有一个ActionBar
  • Theme.Holo.Light.DarkActionBar:有一个黑色的ActionBar
  • Theme.Material.Light:(API21  Android5.0)

(2)自定义主题

在res/values/styles.xml文件中:

<resource>
	<style name="BaseAppTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
		<!-- Action Bar的背景颜色-->
		<item name="colorPrimary">@color/red</item>
		<!-- 状态栏的颜色-->
		<item  name="colorPrimaryDark">@color/pRed</item>
		<!-- 所有拥有焦点/激活状态的控件的颜色-->
		<item name="colorAccent">@color/green</item>
		<!-- 未选中控件的颜色-->
		<item name="colorControlNormal">@color/mYellow</item>
		<!-- 已激活的空间的颜色-->
		<item name="colorControlActivated">@color/mGray</item>
	</style>
</resource>

常用的Theme属性:

  • android:windowNoTitle:设置为true时,表示移除默认的状态栏
  • android:windowFullscreen:设置为true,表示移除状态栏并全屏显示
  • android:windowBackground:设置Drawable或color为背景
  • android:windowContentOverlay:窗口内容前景上放置的Drawable,默认为状态栏下的阴影,设置为null可以将其移除。
可以为Activity设置Theme属性:
<activity android:name=".MainActivity" 
	android:theme="@style/BaseAppTheme">
	........
</activity>

Theme在开发中的重要应用:
APP在启动 的时候,首先打开的第一个FirstActivity,当FirstActivity有一张比较大的背景图片的时候,启动APP,APP界面立刻打开,但是首先看到的是黑色的屏幕,然后很快显示背景图片,这是由于Activity在绘制大图片时有较大耗时的,此时可以使用Theme来解决,使用Theme指定Activity的背景之后,Activity会首先为Activity加载Theme,然后再去启动该Activity,这样APP打开会有一点点延时,但是当Activity界面显示出来的时候,看到的是背景图片,而不是黑色屏幕,这种效果要比前面要好:

在res/values/styles.xml中:
<style name="StartAppTheme" parent="AppBaseTheme">
	<item name="android:windowNoTitle">true</item>
	<!-- bg_start.png为启动图片-->
	<item name="android:windowBackground">@drawable/bg_start</item>
</style>

在AndroidManifest.xml中引用:
<activity android:name=".WelComeActivity"
	android:screenOrientation="portrait"
	android:theme="@style/StartAppTheme">
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />
		<action android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
</activity>

你可能感兴趣的:(Android开发Theme和Style)