android 自定义标题栏 状态栏颜色设置

  • 隐藏标题栏
//启动文件中设置
android:theme="@style/Theme.AppCompat.NoActionBar"
  • 自定义的nav标题栏, 可以自己完善
package base.components;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;

import com.example.learnandroid.R;

import utils.GlobalModule;

public class BaseNav extends LinearLayout {
        private TextView backText, centerText;
        private FontIconView backIcon;
        private LinearLayout areaLeft, areaCenter, areaRight, content;
        private String left, leftIcon;
        private int titleColor, backgroundColor, leftTextColor;
        private boolean fitStatus = true, showBack = false;
        private int marginH = 0;

        public  String title;


        public BackClick backClick;

        public BaseNav(Context context) {
                this(context, null);
        }

        public BaseNav(Context context, @Nullable AttributeSet attrs) {
                this(context, attrs, 0);
        }

        public BaseNav(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

                super(context, attrs, defStyleAttr);
                //设置一些默认值
                marginH = dp(10);
                titleColor = ContextCompat.getColor(context, R.color.NavTitleColor);
                leftTextColor = ContextCompat.getColor(context, R.color.NavLeftColor);
                backgroundColor = ContextCompat.getColor(context, R.color.NavBackgroundColor);

                //获取自定义属性 别人使用时可能在xml中使用属性,在下面获取 from nav_attr.xml(除非defStyleAttr为0(可以理解为theme中没有相关属性),否则程序根本不会去从我们的defStyleRes找属性值)
                //解析属性的优先级: xml > style > defStyleAttr > defStyleRes > theme
                TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BaseNav);
                for (int i = 0; i < typedArray.getIndexCount(); i++) {
                        int attr = typedArray.getIndex(i);
                        switch (attr) {
                                case R.styleable.BaseNav_backgroundColor:
                                        backgroundColor = typedArray.getColor(R.styleable.BaseNav_backgroundColor, ContextCompat.getColor(context, R.color.NavBackgroundColor));
                                        break;
                                case R.styleable.BaseNav_leftIcon:
                                        leftIcon = typedArray.getString(R.styleable.BaseNav_leftIcon);
                                        break;
                                case R.styleable.BaseNav_leftText:
                                        left = typedArray.getString(R.styleable.BaseNav_leftText);
                                        break;
                                case R.styleable.BaseNav_leftTextColor:
                                        leftTextColor = typedArray.getColor(R.styleable.BaseNav_leftTextColor, ContextCompat.getColor(context, R.color.NavLeftColor));
                                        break;
                                case R.styleable.BaseNav_title:
                                        title = typedArray.getString(R.styleable.BaseNav_title);
                                        break;
                                case R.styleable.BaseNav_titleColor:
                                        titleColor = typedArray.getColor(R.styleable.BaseNav_titleColor, ContextCompat.getColor(context, R.color.NavTitleColor));
                                        break;
                                case R.styleable.BaseNav_showBack:
                                        showBack = typedArray.getBoolean(R.styleable.BaseNav_showBack, true);
                                        break;
                                case R.styleable.BaseNav_fitStatus:
                                        fitStatus = typedArray.getBoolean(R.styleable.BaseNav_fitStatus, true);
                                        break;
                        }
                }
                typedArray.recycle();
                this.initViews(this, context);
        }


        @SuppressLint({"Range", "ResourceAsColor"})
        private void initViews(View view, Context context) {
                //设置背景颜色
                if (backgroundColor == 0) {
                        setBackgroundColor(ContextCompat.getColor(context, R.color.NavBackgroundColor));
                } else {
                        setBackgroundColor(backgroundColor);
                }
                //内容高度
                int contentHeight = dp(50);
                //状态栏高度, 不需要状态栏为0
                int topMargin = this.fitStatus ? GlobalModule.getStatusBarHeight(context) : 0;

                //内容容器
                content = new LinearLayout(context);
                LinearLayout.LayoutParams contentLayoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, contentHeight);
//                content.setPadding(marginH, topMargin, marginH, 0);
                contentLayoutParams.setMargins(marginH, topMargin, marginH, 0);
                contentLayoutParams.rightMargin = marginH;
                content.setLayoutParams(contentLayoutParams);

                //左边LinearLayout

                areaLeft = createLinearLayout(LayoutParams.WRAP_CONTENT, contentHeight, context);
                areaLeft.setBackgroundColor(Color.TRANSPARENT);
//                areaLeft.setGravity(Gravity.CENTER_HORIZONTAL);
                //左边icon
                if (showBack) {
                        backIcon = new FontIconView(view.getContext());
                        LinearLayout.LayoutParams leftIconParams = new LayoutParams(dp(20), LayoutParams.MATCH_PARENT);
                        backIcon.setLayoutParams(leftIconParams);
                        backIcon.setGravity(Gravity.CENTER);
                        backIcon.setTextColor(R.color.NavLeftColor);
                        backIcon.setTextSize(15);
                        backIcon.setTextColor(leftTextColor);


                        if (leftIcon == null) {
                                Typeface iconFont = Typeface.createFromAsset(view.getContext().getAssets(), "iconfont.ttf");
                                backIcon.setTypeface(iconFont);
                                backIcon.setText(R.string.back);
                        } else {
                                backIcon.setText(leftIcon);
                        }
                        areaLeft.addView(backIcon);

                        //左边文字
                        backText = new TextView(context);
                        backText.setText(left);
                        backText.setLines(1);
                        backText.setGravity(Gravity.CENTER);
                        backText.setTextColor(R.color.NavLeftColor);
                        backText.setTextSize(13);
                        backText.setTextColor(leftTextColor);

                        LinearLayout.LayoutParams leftTextParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
                        backText.setLayoutParams(leftTextParams);

                        areaLeft.addView(backText);
                }
                areaLeft.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                                backClick.click();
                        }
                });

                Log.i("areLeftLog:", String.valueOf(linearLyoutWidth(areaLeft)));

                //中间文字
                areaCenter = new LinearLayout(context);
                LinearLayout.LayoutParams layoutParamsCenter = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
                layoutParamsCenter.gravity = Gravity.CENTER;
                areaCenter.setLayoutParams(layoutParamsCenter);
                if (title != null && !title.isEmpty()) {
                        //有标题
                        centerText = new TextView(context);
                        LinearLayout.LayoutParams centerParams = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
                        centerText.setLayoutParams(centerParams);
                        centerText.setGravity(Gravity.CENTER);
                        centerText.setTextSize(16);
                        centerText.setText(title);
                        centerText.setTextColor(titleColor);
                        areaCenter.addView(centerText);
                }
                areaRight = createLinearLayout(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, context);
                setTitleCenter();
                content.addView(this.areaLeft);
                content.addView(areaCenter);
                content.addView(areaRight);
                addView(content);
        }

        private void setTitleCenter(){
                if(title != null && !title.isEmpty()){
                        //设置文字剧中 areaCenter边距左右各10
                        int left = linearLyoutWidth(areaLeft);
                        int right = linearLyoutWidth(areaRight);
                        int tmpValue = Math.abs((left - right));
                        if(left > right){
                                areaCenter.setPadding(10, 0, (10 + tmpValue), 0);
                        }else{
                                areaCenter.setPadding((10 + tmpValue), 0, 10, 0);
                        }
                }
        }

        private LinearLayout createLinearLayout(int width, int height, Context context) {
                LinearLayout linearLayout = new LinearLayout(context);
                LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(GlobalModule.dp2px(context, width), height);
                linearLayout.setLayoutParams(layoutParams);
                return linearLayout;
        }

        //获取自定义LinearLayout宽度
        private int linearLyoutWidth(LinearLayout linearLayout) {
                linearLayout.measure(0, 0);
                return linearLayout.getMeasuredWidth();
        }

        public void customLeft(LinearLayout linearLayout) {
                areaLeft.removeAllViews();
                areaLeft.addView(linearLayout);
                setTitleCenter();
        }

        public void customCenter(LinearLayout linearLayout) {
                //隐藏centerText
                areaCenter.removeAllViews();
                areaCenter.addView(linearLayout);
        }

        private int dp(int px) {
                return GlobalModule.dp2px(getContext(), px);
        }

        public void customRight(LinearLayout linearLayout) {
                areaRight.removeAllViews();
                areaRight.addView(linearLayout);
                setTitleCenter();
        }

        public interface BackClick {
                public void click();
        }
}


package utils;

import android.content.Context;
import android.content.res.Resources;

public class GlobalModule {
       public static boolean isDebug = true;
       public static String APP_NAME = "";

       /**
        * 获取状态栏高度
        * @param context
        * @return
        */
       public static int getStatusBarHeight(Context context) {
              Resources resources = context.getResources();
              int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
              int height = resources.getDimensionPixelSize(resourceId);
              return height;
       }

       public static int dp2px(Context context, float dpValue) {
              float density = context.getResources().getDisplayMetrics().density;
              return (int) (dpValue * density + 0.5f);
       }

       public static int sp2px(Context context, float spValue) {
              float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
              return (int) (spValue * fontScale + 0.5f);
       }

       public static int px2dp(Context context,float pxValue) {
              float density = context.getResources().getDisplayMetrics().density;
              return (int) (pxValue / density + 0.5f);
       }

       public static int px2sp(Context context, float pxValue) {
              float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
              return (int) (pxValue / fontScale + 0.5f);
       }
}

自定义的nav属性


image.png
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="BaseNav">
        <attr name="leftText" format="string"/>
        <attr name="leftTextColor" format="color" />
        <attr name="title" format="string" />
        <attr name="titleColor" format="color" />
        <attr name="leftIcon" format="string" />
        <attr name="backgroundColor" format="color" />
<!--        适配状态栏, 需要让状态栏透明-->
        <attr name="fitStatus" format="boolean" />
        <attr name="showBack" format="boolean" />
    </declare-styleable>
</resources>

在布局文件中使用

<base.components.BaseNav
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:title="首页"
        app:showBack="false"
        app:leftText="返回"
        app:fitStatus="false"
        tools:ignore="MissingConstraints" />
  • 全局设置状态栏颜色
//状态栏透明
        public static void makeStatusBarTransparent(Activity activity) {
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                        return;
                }
                Window window = activity.getWindow();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                        int option = window.getDecorView().getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
                        window.getDecorView().setSystemUiVisibility(option);
                        window.setStatusBarColor(Color.TRANSPARENT);
                } else {
                        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                }
        }
  • 使用提示: 不需要状态栏请透明, fitStatus是否需要适配状态栏高度


    image.png
nav = findViewById(R.id.nav);
                LinearLayout linearLayout = ActivitySetting.createLinearLayout(100, LinearLayout.LayoutParams.MATCH_PARENT, this);
                linearLayout.setBackgroundColor(Color.WHITE);

                LinearLayout linearLayout2 = ActivitySetting.createLinearLayout(150, LinearLayout.LayoutParams.MATCH_PARENT, this);
                linearLayout2.setBackgroundColor(Color.YELLOW);

                nav.customLeft(linearLayout);
                nav.customRight(linearLayout2);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,104评论 4 62
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,754评论 1 92
  • 让别人好,就是提升自己的能力,就是为人创造价值,就是考虑合作者利益,就是取得他人的信任。这些活,那个快得了?都慢得...
    飘飘轻阅读 356评论 0 0
  • 阳光,水,绿树,可是我在哪?我居然变成了只羊驼。 1、 我回头扫了眼四周,都是和我一样毛茸茸的羊驼,它们有的坐在地...
    张铁钉阅读 957评论 17 25
  • 也曾桀骜挺拔 有过佳人烈马 兄弟推杯换盏 笑谈纵横天下 肆意潇洒 尝尽繁华…… 如今看, 夕阳西下 红颜谢了芳华 ...
    乱语别裁阅读 791评论 0 2