Android隐藏标题栏ActionBar的几种方式

  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 设置隐藏 ActionBar -->
        <activity
            android:name=".spannable.SpannableActivity"
            android:theme="@android:style/Theme.Holo.Light.NoActionBar" />
    </application>

 样式文件 style.xml

<resources>
    <!-- Base application theme. -->
    <!-- 如果使用下面这个parent主题,就是隐藏标题栏,同时隐藏状态栏 -->
    <!--  <style name="AppTheme" parent="android:Theme.Holo.Light.NoActionBar.Fullscreen"> -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        ......
    </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设置隐藏 ActionBar -->
        <activity
            android:name=".glide.GlideSampleActivity"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
    </application>
<resources>
    <!-- Base application theme. -->
    <!-- 使用下面的这个主题也可以隐藏标题栏,只是主题是默认的 Dark -->
    <!-- <style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        ......
    </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节点下设置主题。使用代码需要每个类中都写一遍,比较麻烦,而且还容易遗漏。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值