Android 3.0 系统之后,Google 引入了 ActionBar 要统一安卓应用的导航栏样式。但是由于 ActionBar 难以定制,在很大程度上制约了开发人员开发与设计的弹性。所以,较为常见的实现方式是:使用ViewGroup来封装一个自己的 HeaderBar。
自2014年 Google I/O 大会上 Material Design 横空出世后,市场上的应用又逐步趋向了样式的风格统一,support library中很快就出来了 ToolBar 控件,一个可定制化的 ViewGroup,以此来替代 ActionBar。
注意: 如果要使用 ToolBar,请记得用 support v7 里的 ToolBar,不然只有 API Level 21 也就是 Android 5.0 以上的版本才能使用,这将会出现 App 兼容老版本(5.0以下)的兼容性问题。
当然这不是本篇要讲的重点,不管是使用自己封装的 HeaderBar,还是使用 ToolBar,我们首先要隐藏掉 Android 系统自带的 ActionBar。下面就逐一列举一下隐藏的方法:
1、Activity 继承自 Activity 的时候
1.1、在 AndroidManifest.xml 文件和 style.xml 文件中
清单配置文件 AndroidManifest.xml
<application
......
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<activity
android:name=".spannable.SpannableActivity"
android:theme="@android:style/Theme.Holo.Light.NoActionBar" />
application>
样式文件 style.xml
<resources>
<style name="AppTheme" parent="android:Theme.Holo.Light.NoActionBar">
- "colorPrimary"
>@color/colorPrimary
......
style>
resources>
当然这里是将 theme 主题直接设置到 Application 节点,这样整个 App 的 ActionBar 都隐藏。你也可以为 Application 节点下某一个 Activity 设置上面的主题样式,这样只对所设置的当前 Activity 有效。
1.2、在 Java 代码中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 继承自 AppCompatActivity 时,这种方法是无效的,继承自 Activity 时有效
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 去掉 Activity 上面的状态栏
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 上面两行都是写到 setContentView 之前的,否者会报错
setContentView(R.layout.activity_main);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 去掉 Activity 上面的状态栏
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
// 继承自 Activity 时有效,这个是写在 setContentView 之后的
// 注意:这里清单配置文件中最低版本要 11 或以上,不然会报错的,因为 11 之前的版本是不支持 ActionBar 的
getActionBar().hide();
}
注意: 这里有些小伙伴可能会遇到 getActionBar() 报空指针的异常。这里 Activity 是直接继承自 Activity,那么在 style.xml 文件中,或单独设置主题时,不能用 AppCompatTheme,也就是 Theme.AppCompat 的主题,使用 android:Theme.Holo.Light 等是可以的,此时是能够正确返回 ActionBar 对象的。当然如果主题您已经按上面 1.1 设置 NoActionBar 了,那指定会报空指针异常的。
2、Activity 继承自 AppCompatActivity 的时候
2.1、在 AndroidManifest.xml 文件和 style.xml 文件中
同上述介绍的 1.1,在 AndroidManifest.xml 和 style.xml 中改变几行代码
<application
......
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<activity
android:name=".glide.GlideSampleActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
application>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
- "colorPrimary"
>@color/colorPrimary
......
style>
resources>
注意: 这里设置基本和上面 1.1 一样的,只是这里使用的主题样式是 AppCompatTheme,也就是 Theme.AppCompat,不能使用 android:Theme.Holo.Light,不然运行会报错,提示你需要使用 Theme.AppCompat。
2.2、在 Java 代码中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 继承自 AppCompatActivity 时,这种方法是无效的,继承自 Activity 时有效
// requestWindowFeature(Window.FEATURE_NO_TITLE);
// 去掉Activity上面的状态栏
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
// 继承自 AppCompatActivity 时有效,这个是写在 setContentView 之后的,这里使用 getActionBar() 会报空指针
getSupportActionBar().hide();
}
注意: Activity 继承自 AppCompatActivity 时,调用 getActionBar() 也会报空指针。因为如果您使用 AppCompatActivity 时,需要用到支持库 support library,此时您必须使用 getSupportActionBar()。
结语: 如果要设置整个 App 都隐藏 ActionBar,推荐使用清单配置文件和样式文件,在Application节点下设置主题。使用代码需要每个类中都写一遍,比较麻烦,而且还容易遗漏。