Android 关于状态栏开发的几件事

这个效果大家脑补下,就不贴图了

首先在style.xml中设置为noActionBar的主题,这是必须的

方式有三种

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_fullscreen_no_text);

//方式一

//getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

//方式二

//getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);

//方式三 style.xml中配置

//

// true

//

}

2

需求二、全屏保留状态栏文字(页面上部有Banner图)

这里写图片描述

现在项目,大部分向下支持到19,所以先不考虑太低版本的情况

Window window = getWindow();

//默认API 最低19

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {

window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

ViewGroup contentView = window.getDecorView().findViewById(Window.ID_ANDROID_CONTENT);

contentView.getChildAt(0).setFitsSystemWindows(false);

}

3

需求三、标题栏与状态栏颜色一致 xml中配置

这里写图片描述

我们能看到这种处理方式,是可以解决一些业务场景,但是如果在低于21版本手机上就不管用了,那怎么办呢?请接着往下看

Window window = getWindow();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

window.setStatusBarColor(getResources().getColor(R.color.status_toolBar_same_color));

} else {

window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

ViewGroup systemContent = findViewById(android.R.id.content);

View statusBarView = new View(this);

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight());

statusBarView.setBackgroundColor(getResources().getColor(R.color.status_toolBar_same_color));

systemContent.getChildAt(0).setFitsSystemWindows(true);

systemContent.addView(statusBarView, 0, lp);

}

适配后的结果:

这里写图片描述

4

需求四、不同Fragment中对StatusBar的处理不一样

先上图

这里写图片描述

<android.support.v7.widget.Toolbar

android:id=“@+id/base_toolbar”

android:layout_width=“match_parent”

android:layout_height=“?attr/actionBarSize”

android:background=“@android:color/holo_blue_dark”>

<TextView

android:id=“@+id/base_title”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_gravity=“center”

android:textColor=“@android:color/black” />

</android.support.v7.widget.Toolbar>

<FrameLayout

android:id=“@+id/base_container”

android:layout_width=“match_parent”

android:layout_height=“0dp”

android:layout_weight=“1”>

上述代码是两个Fragment所依附的Activity对应的部分layout

private void addStatusBar() {

//条件状态栏透明,要不然不会起作用

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

if (mStatusBarView == null) {

mStatusBarView = new View(FragmentStatusAndActionBarActivity.this);

int screenWidth = getResources().getDisplayMetrics().widthPixels;

int statusBarHeight = getStatusBarHeight();

ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(screenWidth, statusBarHeight);

mStatusBarView.setLayoutParams(params);

mStatusBarView.requestLayout();

//获取根布局

ViewGroup systemContent = findViewById(android.R.id.content);

ViewGroup userContent = (ViewGroup) systemContent.getChildAt(0);

userContent.setFitsSystemWindows(false);

userContent.addView(mStatusBarView, 0);

}

}

上面是对应Activity中的布局,意思就是不使用系统提供的ActionBar,使用ToolBar来代替(网上一大推代替的方法),下面的代码中设置,状态栏透明,并且设置了sitFitSystemWindow(false),通过这些操作,我们相当于把系统的StatusBar,ActionBar,都干掉了,那么接下来,我们就可以模拟创建出StatusBaruserContent.addView(mStatusBarView, 0);那么现在我们就可以自己控制statusBar和ActionBar,显示什么颜色?消失还是隐藏?

ToolBar显示的Fragment:

@Override

public void onHiddenChanged(boolean hidden) {

super.onHiddenChanged(hidden);

mActivity.mToolbar.setVisibility(View.VISIBLE);//设置ToolBar显示

//设置statusBar的颜色

mActivity.mStatusBarView.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_bright));

}

ToolBar隐藏的Fragment

@Override

public void onHiddenChanged(boolean hidden) {

super.onHiddenChanged(hidden);

mActivity.mToolbar.setVisibility(View.GONE);//设置ToolBar消失

//设置statusBar的颜色

mActivity.mStatusBarView.setBackgroundColor(getResources().getColor(android.R.color.holo_orange_light));

}

5

需求五、设置状态栏文字的颜色

这里写图片描述

//设置白底黑字

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

getWindow().getDecorView()

.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

}

但是需要注意的是:目前只有android原生6.0以上支持修改状态栏字体。

除此国内厂商小米、魅族也开放了修改状态栏字体的方式:

小米 MIUI6

https://dev.mi.com/doc/p=4769/index.html

魅族 Flyme

http://open-wiki.flyme.cn/index.php?title=状态栏变色

6

需求六

需求六、切换fragment时,toolBar和statusbar显示与否、statusBar颜色、status文字颜色(新增)

评论区,有同学提出能否”不同Fragment中切换状态栏颜色和状态栏文字的颜色,甚至同时切换风格(纯色状态栏变成banner往上顶的状态栏)的情况”,这种情况肯定是没有问题的,也不难,现在状态栏和标题栏都是我们自己,我们想让它怎么样,它不得乖乖听话,对不~

先上图:

这里写图片描述

其实调整的不多,这里我只贴下关键代码,gitub代码仓库已更新,大家可以clone看完成代码。

这是只有Banner的fragment:

@Override

public void onHiddenChanged(boolean hidden) {

super.onHiddenChanged(hidden);

//设置ToolBar隐藏

mActivity.mToolbar.setVisibility(View.GONE);

//设置statusBar的隐藏

mActivity.mStatusBarView.setVisibility(View.GONE);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

题外话

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

[外链图片转存中…(img-MHhn7Bb1-1711545366031)]

希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值