自定义导航栏及实现沉浸式状态栏

android自带的导航栏太难看了,不如自定义一个导航栏好看。如下图:


首先在MainActivity.java的Oncreat中添加如下代码:

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //声明使用自定义标题
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        /**
         * 判断android的版本号4.4以上才可以设置沉浸式主题
         */
        if(Integer.valueOf(android.os.Build.VERSION.SDK)>=19) {
            //动态设置主题
            this.setTheme(R.style.MyCustomTheme);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                /**
                 * 让位于装置最上方的状态lie (Status Bar) 以及最下方的导航列 (Navigation Bar) 可以被透明化,
                 * 并让 APP 的layout布局内容可以往上下延伸,使整个画面的可被利用度大幅提升。
                 */
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            }
        }else{
            this.setTheme(R.style.MyCustomTheme1);
        }
        setContentView(R.layout.activity_two);
        //自定义布局赋值
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);
        //导航栏上的按钮添加响应事件
        Button titleBackBtn = (Button)findViewById(R.id.TitleBackBtn);
        titleBackBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(TwoActivity.this,"hello",Toast.LENGTH_LONG).show();
            }
        });
    }

动态设置主题用到的styles如下:

   <!-- 导航栏 -->
    <style name="TitleBarBackground">
        <item name="android:background">#33b5e5</item>
    </style>
    <!-- 4.4导航栏 -->
    <style name="MyCustomTheme" parent="android:Theme.Light">
        <item name="android:windowTitleBackgroundStyle">@style/TitleBarBackground</item>
        <item name="android:windowTitleSize">77dp</item>
    </style>
    <!-- 版本低于4.4导航栏 -->
    <style name="MyCustomTheme1" parent="android:Theme.Light">
        <item name="android:windowTitleBackgroundStyle">@style/TitleBarBackground</item>
        <item name="android:windowTitleSize">50dp</item>
    </style>

自定义布局中引入的layout如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/head_center_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_alignParentBottom="true"
        android:text="我是导航栏"
        android:textSize="20sp"
        android:layout_marginBottom="10dp"
        />
    <ImageView
        android:id="@+id/head_left_text"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="0dp"
        android:background="@drawable/lorry"
        android:layout_alignBottom="@+id/TitleBackBtn"/>
    <Button
        android:id="@+id/TitleBackBtn"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:text="我是按钮"
        android:textColor="#ff6501"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="#01000000"/>
</RelativeLayout>

其中通过设置按钮背景为透明实现跟可点击的textview一个效果:
android:background="#01000000"


注意:MainActivity应该继承自Activity而不是ActionbarActivity;styles中继承不同的主题效果也不一样。

相关参考:关于状态栏透明等等状态栏一体化自定义标题栏



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值