1.解决方案
用主题和windowsManager自定义窗口的属性和功能。
2.实现机制
2.1 用主题自定义窗口属性
Android中主题Theme就是一种应用到整个应用或某个activity的外观风格。使用主题有两种方式,系统主题和自定义主题
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<application
在application节点下的是全局的设置
<!-- android:theme="THEME_NAME" apply to the application tag for a global theme -->
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity
android:name=".DemoActivity"
在activity节点下的是某个activity的设置
<!-- android:theme="THEME_NAME" apply to an activity for a individual theme -->
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
几种常见的theme
Theme.NoTitleBar 移除标题栏
Theme.NoTitleBar.Fullscreen移除标题栏和 状态栏全屏显示
Theme.Dialog让activity看着像对话框
Theme.Wallpaper将用户设置的墙纸设置为窗口的背景
2.2自定义主题
在res/values目录下建立style.xml,常见的与窗体有关的主题元素有:
android:windowNoTitle控制是否移除默认的标题栏,为true的话移除
android:windowFullScreen控制是否移除默认状态栏,为true的话移除
android:windowBackground将某个颜色或可绘制的资源设为背景
android:windowContentOverlay默认情况下就是状态栏的阴影,可以用任何资源代替,设置为null时候(xml中的@null)将其移除
android:windowTitleBackgroundStyle应用到窗口的标题视图的风格
android:windowTitleSize窗口标 题的高度
android:windowTitleStyle窗口标题文本的风格
res/values/style.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name = "MyTheme.One" parent = "@android:style/Theme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
<!-- 主题和风格可以从父主题继承 -->
<style name = "MyTheme.Two" parent = "@android:style/Theme">
<item name="android:windowBackground">@drawable/ic_launcher</item>
<item name="android:windowFullscreen">@null</item>
</style>
</resources>
然后再清单文件中引用即可
例如如果要Theme.One作用到activity只要在该activity节点下加一行android:theme="@style/MyTheme.One" 即可
也可以在代码中自定义窗口属性
在将内容视图作用于activity之前,每个窗口特性的改动都要调用Activity.requestWindowFeature(),也就是说所有通过
Activity.requestWindowFeature()修改窗体的改动都需要在setContentView之前完成,否则是无效的
2.2.1
FEATURE_CUSTOM_TITLE自定义标题
通过这个特征,可以用完全自定义的资源来替换标准的标题( 代码如下)
@Override的
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentview之前请求窗口的特性
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.main);
//设置自定义标题的布局资源
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custome_title);
}
FEATURE_NO_TITLE用于移除标准的标题视图(不能与其他的窗口特性标志一起使用)
FEATURE_PROGRESS在窗口标题中设置一个确定式的进度条,该进度条的值可以使从0到100之间任意值
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentview之前请求窗口的特性
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main);
//设置进度条可见
setProgressBarVisibility(true);
//设置进度值
setProgress(0);
/* //到达100的时候进度栏消失
setProgress(100); */
}
FEATURE_LEFT_ICON
FEATURE_RIGHT_ICON这两个都是使用图标的activity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentview之前请求窗口的特性
requestWindowFeature(Window.FEATURE_LEFT_ICON);
setContentView(R.layout.main);
setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,R.drawable.ic_launcher);
}