Android 4.0中去掉标题栏和状态栏的方法
在Android中如何去除状态栏和标题栏这个问题,视乎并不复杂,但随着Android快速发展,不同的版本还是有一些差异,在项目中还是要稍加注意,否则会出现不少问题和反复。最近项目中就曾出现过这样的问题。有点扯远了,言归正传。在之前的 Android去掉标题栏和状态栏的方法 文中介绍的方法,完全适用于Android2.3版本,但是Android4.0版本中却并不能完全实现目的。
首先说Android4.0中去除标题栏和状态栏的方法,
一、在代码中使用方法如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().getDecorView().setSystemUiVisibility(View.GONE);//隐藏状态栏
setContentView(R.layout.activity_main);
}
此方法可使在Android4.0以上版本实现状态栏的隐藏,再加上我们在Android2.3中常用的去除标题栏的方法就可以成功的在Android4.0以上版本中实现全屏了!
注意:在该语句中的setSystemUiVisibility()方法需要API level 11 ,如果使用的SDK版本太低也是不能实现全屏的。所以一定要在AndroidManifest.xml文件中配置sdk的targetSdkVersion大于或等于11;
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" /> <!--sdk目标版本大于11-->
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
这段代码在Android4.0中是可以使用的,隐藏掉的是TitleBar,也可以实现"全屏"但是这里的全屏并不是真正意义上的全屏,在屏幕的最下方会有3个虚拟键(back,home,recentApp)。
4.0之前的机器,一般都是3个物理按键,所以实现全屏没有什么问题,但是4.0以后物理按键变成了虚拟按键,如果去掉状态栏你会发现没有返回键、主菜单键,所以现在用该代码来实现的全屏,始终最底下会有3个虚拟键.
当然对于Android系统自带的Theme.Style不满意,可以自己定义新的Theme.Style.
三、一些语句分析
getWindow().getDecorView().setSystemUiVisibility(View.GONE);
getWindow(): 获取本activity的窗口实例;
getDecorView(): 获取DecorView;
setSystemUiVisibility(View.GONE):该方法类似我们的应用代码中经常使用某个view的setVisibility()方法来隐藏、显示和去掉这个view;只不过这里是来去除系统UI的view;实质也是找到状态栏的View然后调用系统api把它去除掉!
四、对于自定义Theme.style的说明
在Android4.0源代码中添加系统的自定义Theme.style,需要修改以下两个文件:Framework/base/core/res/values/目录下的public.xml,Themes.xml。在public.xml中定义新style的name和id,在style.xml中定义具体style.实例如下:
在public.xml中
<!--my Custom Theme Begin-->
<public type="style" name="Theme.Holo.NoTitleBar"id="0x010301f0" />
<public type="style"name="Theme.Holo.NoTitleBar.Fullscreen" id="0x010301f1"/>
<!--my Custom Theme End-->
在Themes.xml中
<style name="Theme.Holo.NoTitleBar">
<itemname="android:windowFullscreen">false</item>
<itemname="android:windowActionBar">true</item>
<itemname="android:windowNoTitle">true</item>
</style>
<style name="Theme.Holo.NoTitleBar.Fullscreen">
<itemname="android:windowFullscreen">true</item>
<itemname="android:windowActionBar">true</item>
<itemname="android:windowNoTitle">true</item>
</style>
注意:1. public.xml中style的id是唯一的,不能和其他Id重复。name也要注意,例如:要定义Theme.holo.NoTitleBar.FullScreen这个style,要先定义Theme.holo.NoTitleBar,否则系统也会报错:找不到Theme.holo.NoTitleBar。
2. 在源码中添加系统的自定义Theme.style 之后,要make update-api,否则编译将出错。
3. 自定义Theme.style如要在应用的<application>字段使用,要注意不要和其包含的<activity>字段中定义的Theme.style冲突,否则进入该Activity时会出错。
在应用中可直接在应用的res/values/style.xml中按规则添加新的style,之后在该应用中使用。