Android开发学习之使用Toolbar实现不同的Fragment使用不同颜色的标题栏与状态栏

Android标题栏控制全解析:从ActionBar到Toolbar的沉浸式实践 在Android应用开发中,视图系统是构建用户界面的核心基础,它通过Window、DecorView等层级结构管理屏幕内容的绘制与交互。理解视图层级与Window机制,是掌握界面动态控制的关键原理,这直接关系到应用的用户体验与视觉一致性。其技术价值在于,开发者可以基于此实现灵活的界面适配与交互响应,从而提升应用的可用性与品牌辨识度。在沉浸式阅读、视频播放、游戏或多级导航等应用场景中,对顶部标题栏(ActionBar/Toolbar)的精细控制——包括动态隐藏、显示及标题修改——成为实现特定界面效果的基础需求 阅读详情

                                          

先看效果图。就像上面两幅图片一样,当我们点击下面的导航栏按钮时,APP会切换Fragment,且会更改标题栏和状态栏的颜色。这篇文章主要便是记录该效果的实现过程。

activity的布局如下

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/frame"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </FrameLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#000000"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:background="#fff"
        android:layout_height="50dp">

        <LinearLayout
            android:id="@+id/one_lin"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:gravity="center"
            android:layout_height="match_parent">
            <ImageView
                android:id="@+id/one_img"
                android:layout_width="30dp"
                android:src="@drawable/fk"
                android:layout_height="30dp" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/two_lin"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:gravity="center"
            android:layout_height="match_parent">
            <ImageView
                android:id="@+id/two_img"
                android:layout_width="30dp"
                android:src="@drawable/fl"
                android:layout_height="30dp" />
        </LinearLayout>
        <!--<LinearLayout-->
            <!--android:id="@+id/three_lin"-->
            <!--android:layout_weight="1"-->
            <!--android:layout_width="match_parent"-->
            <!--android:gravity="center"-->
            <!--android:layout_height="match_parent">-->
            <!--<ImageView-->
                <!--android:id="@+id/three_img"-->
                <!--android:layout_width="30dp"-->
                <!--android:src="@drawable/bg_three"-->
                <!--android:layout_height="30dp" />-->
        <!--</LinearLayout>-->

    </LinearLayout>

</LinearLayout>

设置one_lin和two_lin的监听事件,当点击时显示对应的fragment,其中setWindowStatusBarColor为控制状态栏颜色的函数,ScanFragment和MyFragment两个类是我们继承Fragment实现的两个类,将在后面详细介绍。

public void onClick(View v) {
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        switch (v.getId()){
            case R.id.one_lin:
                setWindowStatusBarColor(0);
                if (myFragment != null)
                    transaction.hide(myFragment);
                if (scanFragment == null){
                    scanFragment = new ScanFragment();
                    transaction.add(R.id.frame, scanFragment);
                    transaction.show(scanFragment);

                }else{
                    transaction.show(scanFragment);
                }
                break;
            case R.id.two_lin:
                setWindowStatusBarColor(1);
                if (scanFragment != null)
                    transaction.hide(scanFragment);
                if (myFragment == null){
                    myFragment = new MyFragment();
                    transaction.add(R.id.frame, myFragment);
                    transaction.show(myFragment);
                }else{
                    transaction.show(myFragment);
                }
                break;
        }
        transaction.commit();
    }

状态栏颜色的修改在4.4和5.x环境下分别有不同的方式,低于4.4以下是不能修改的。而且对于不同定制系统也要做不同的适配,这里我暂时使用的是一个已经封装好的库(待测试适配性),只需在build.gradle文件的dependencies{}中添加

implementation 'com.githang:status-bar-compat:latest.integration'

setWindowStatusBarColor函数如下

 private void setWindowStatusBarColor(int i) {
        switch (i){
            case 0:
                StatusBarCompat.setStatusBarColor(this,  getResources().getColor(R.color.gray), true);
                break;
            case 1:
                StatusBarCompat.setStatusBarColor(this,  getResources().getColor(R.color.green), true);
                break;
        }
    }

接下来修改标题栏,默认的标题栏设置我们可以在res->values->styles.xml中看到,默认采用的是ActionBar。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

我们采用ToolBar代替ActionBar,首先修改parent属性为Theme.AppCompat.Light.NoActionBar,然后添加

<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>

两个item,修改后代码如下

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
</style>

这里我们拿MyFragment作示例,MyFragment对应的布局文件如下

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbar_me"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        app:titleTextColor="@android:color/black"
        android:background="@color/green"
        android:minHeight="?android:attr/actionBarSize">  <!-- 最小高度 -->
    </android.support.v7.widget.Toolbar>
</FrameLayout>

在xml文件中添加 android.support.v7.widget.Toolbar,这里需要注意的是我们需要使用android.support.v7.widget.Toolbar,否则过低版本则不可用。

MyFragment代码如下

public class MyFragment extends Fragment {
    @Nullable
    private AppCompatActivity mActivity;
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = View.inflate(getActivity(), R.layout.me_layout, null);
        return view;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mActivity = (AppCompatActivity) getActivity();
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public void onResume() {
        super.onResume();
        Toolbar mToolbar = mActivity.findViewById(R.id.toolbar_me);
        mActivity.setSupportActionBar(mToolbar);
    }
}

需要在onCreateView返回布局的view;onAttach是fragment与activity绑定后调用的函数,之前是获取不到绑定的Activity的;onActivityCreated函数调用时,activity的onCreate函数已经执行完毕,此时我们可以进行ui操作;onResume函数执行时用户可以与fragment进行交互。因此我们在onResume函数里通过

Toolbar mToolbar = mActivity.findViewById(R.id.toolbar_me);
mActivity.setSupportActionBar(mToolbar);

获取我们在xml文件中所写的Toolbar,然后通过setSupportActionBar将Toolbar转为ActionBar。

这样,我们就实现了当点击底部导航栏时,变换状态栏和标题栏的颜色。此外,我们还可以在Toolbar布局下添加其他控件实现自定义标题栏。

(沉浸式)在Activity中或Fragment中任意改变状态栏的颜色 在Activity中或Fragment中任意改变状态栏的颜色,通过反射机制来获得状态栏的高度,通过点位View来叠加颜色 立即下载

相关推荐

Red Hat Enterprise Linux 9.2

安装Red Hat Enterprise Linux 9.2

zhurobert的博客 942

Fragment中使用Toolbar

在应用清单中,将 元素设置为使用 appcompat 的其中一个 NoActionBar 主题。 使用原生的主题 <activity android:name=".MainActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar">或者在需要自己先在 res/values/styles.xml 里增加一个 T

xiaoduzi1991的博客 2754

红外小目标检测新思路:当DETR遇上Mamba状态空间模型,速度提升3倍

本文探讨了将Mamba状态空间模型与DETR框架结合,用于解决红外小目标检测的难题。该创新方案通过线性复杂度的Mamba模块替代传统Transformer的自注意力机制,在保持高检测精度的同时,显著提升了推理速度,实现了实时性能的突破,为无人机巡检、安防监控等场景提供了高效解决方案。

hhh00的博客 665

一个activity有多个fragment,分别设置每个fragment的状态栏颜色。

今天在做一个项目的时候要实现一个activity中可以左右滑动的界面,类似今日头条的新闻界面。我采用的viewpaget和fragment实现。但是问题来了,我想让每个fragment的状态栏有不同的颜色,或者背景图,找了好多博客没找到,如果是activity那就简单了,直接把状态栏设置成透明,然后在布局中设置颜色就可以了,那顺便就把activity的设置方法讲一下。 1.首先定义一个style <style name="ColorTranslucentTheme" parent="Theme.Ap

江小白的博客 2605

单片机NTC热敏电阻测温:六种实用电路方案与选型指南

本文详细介绍了单片机系统中NTC热敏电阻测温的六种实用电路方案,包括分压法、恒流源法、RC充放电法、电桥法、频率法及集成专用IC方案,并提供了关键的硬件选型指南和软件处理技巧,帮助工程师实现高精度、低成本的温度测量。

herb5的博客 821

5G(NR)物理层面试问答

1.什么是参数集(Numerologies)? 答:在5G中由于其频段很宽,设置了不同的子载波带宽,另根据频段、循环前缀、帧结构等组成了参数集。 2.5G中的循环前缀有几种? 答:5G网络支持5种子载波间隔,有两种循环前缀(正常和扩展)。其中:参数集2,即子载波间隔60kHz支持常规循环前缀和扩展循环前缀。 3.5G无线网络在下行(DL)和上行(UL)均使用OFDM波形? 答:5G网络下行链路(DL)和上行链路(UL)使用的波形及处理见下图: 4.5G物理层帧和子帧是多长时间? 答:5G.

starts1990的博客 2378

Android打造通用标题栏——让你的App统一标题栏风格

前言 在Android应用实际开发中,标题栏是App必不可少的元素之一(当然,不包括游戏),大部分情况下,系统提供的标题栏并不能完全满足我们的需求,就需要手动去编写标题栏布局,那么问题来了,如果是在Activity或者Fragment布局文件里面编写标题栏,那岂不是每一个页面的布局文件都要增加不少的代码,如果想更改一下整个app的标题栏的风格...(十脸蒙蔽),甚至有时候还会可能一个不留神写错了

IT_ZJYANG的博客 2万+

SAP-PM设备模块-PM主数据之功能位置

SAP-PM模块学习

TRUIXIANG的博客 5137

在Fragment中如何使用Toolbar

这个Toolbar实在折磨了我好几天。。。知道看到下面这个提醒然后出去吹了吹风,终于弄出来了....其实跟提醒无关。我卡在这句上了.... toolbar.inflateMenu(R.menu.menu_main);代码中还包含 fragment+viewpager+radiobutton实现的仿微信主界面效果。 还是要提醒: 在NoActionBar的主题中 1

程序猿成长之路 1万+

大智慧L2实时api接口的逐笔委托功能执行代码分享

用过l2行情接口的投资者应该都了解大部分的接口都是有逐笔委托功能的,那么大智慧L2实时api接口也有着很强大的逐笔委托功能,投资者可以通过这个逐笔委托功能可以看到一个股票的每天出现的全部委托指令,那么在这个逐笔委托功能里包含了委托价格、委托时间、委托量和委托方向四个要素!那么接下来小编就分享一下大智慧L2实时api接口的逐笔委托功能执行代码!那么在这里提个醒:投资者可以在大智慧L2实时api接口进行设置过滤,在逐笔委托列表里,就仅仅只会显示超过设置委托量或委托额的委托单,而不再显示小单。

Qq_2037696191的博客 3732

ADS高级技巧:用DAC控件实现多变量参数扫描(以S参数和阻抗匹配为例)

本文深入解析了ADS软件中DAC控件的高级应用,指导用户如何利用其实现多变量参数扫描。通过构建支持多变量的MDF文件,并将其与原理图变量动态映射,可以高效完成如S参数和阻抗匹配等复杂场景的联合仿真与可视化分析,显著提升射频电路设计的效率和深度。

3a9bq4r8t2y的博客 254

android两个标题不同,Android开发学习之使用Toolbar实现不同的Fragment使用不同颜色的标题栏与状态栏...

Android开发学习之使用Toolbar实现不同的Fragment使用不同颜色的标题栏与状态栏发布时间:2019-02-19 19:24,浏览次数:360, 标签:AndroidToolbarFragment先看效果图。就像上面两幅图片一样,当我们点击下面的导航栏按钮时,APP会切换Fragment,且会更改标题栏和状态栏的颜色。这篇文章主要便是记录该效果的实现过程。activity的布局如下 ...

weixin_33268492的博客 395

如何完全卸载axure软件以及解决安装axure后打不开的问题【2023年】

如何完全卸载axure软件以及解决安装axure后打不开的问题【2023年】

念兮为美 5139

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

上面是对应Activity中的布局,意思就是不使用系统提供的ActionBar,使用ToolBar来代替(网上一大推代替的方法),下面的代码中设置,状态栏透明,并且设置了sitFitSystemWindow(false),通过这些操作,我们相当于把系统的StatusBar,ActionBar,都干掉了,那么接下来,我们就可以模拟创建出StatusBaruserContent.addView(mStatusBarView, 0);首先在style.xml中设置为noActionBar的主题,这是必须的。

2501_90229252的博客 727

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android activity根节点addview_Android 关于状态栏开发的几件事

简答题全屏、不保留状态栏文字(Splash页面,欢迎页面)全屏保留状态栏文字(页面上部有Banner图)标题栏与状态栏颜色一致(部分App风格)不同Fragment中对StatusBar的处理不一样设置状态栏文字的颜色切换fragment时,toolBar显示与否、statusbar显示与否、statusBar颜色、statusBar文字颜色(新增)思考题Activity中window是怎么回事?...

weixin_39915171的博客 176

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android标题栏深度控制:从ActionBar到Toolbar的动态隐藏、显示与定制

在Android应用开发中,UI组件定制是提升用户体验的关键环节。标题栏作为用户与应用交互的首要视觉焦点,其灵活控制直接影响应用的直观性与专业性。从早期的ActionBar到现代主流的Toolbar,Android提供了多种技术方案来实现标题栏的动态管理。其核心原理在于通过主题配置和代码控制,调整窗口属性和视图可见性,从而满足不同场景下的界面需求。这项技术的价值在于,它允许开发者根据具体页面(如全屏游戏、视频播放器或简洁登录页)灵活调整布局,实现沉浸式体验或自定义导航。在实际工程实践中,开发者需要掌握在Ac

weixin_33709219的博客 385

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android 关于状态栏开发的几件事,为什么大公司一定要使用微服务

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

碧海朝天素 1073

Android 关于状态栏开发的几件事,安卓开发面试题及答案

需求三、标题栏与状态栏颜色一致 xml中配置 我们能看到这种处理方式,是可以解决一些业务场景,但是如果在低于21版本手机上就不管用了,那怎么办呢?请接着往下看 Window window = getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); wi

m0_64319000的博客 274

Android 之路 (11) - 对Toolbar的封装-实现渐变标题栏与沉浸适配

引言 看过上篇文章的演示,就应该能看到我们在滑动返回的时候,顶部的状态栏其实是没和我们的页面一起滑动的,本篇就此问题进行适配,让标题栏沉浸到状态栏中,而且还是能够适配现在市面上所见的异形屏。 正文 我们要实现下面这样的一个标题栏,支持沉浸图片或者纯色,还需要提供 helper,为以后需求变更做准备。 分析 首先来分析一下我们的布局,在默认的情况下,我们的整个屏幕分为三部分(没有考虑虚拟状态栏):...

AndroidRookie 684

android单个页面切换_Android 关于状态栏开发的几件事

简答题全屏、不保留状态栏文字(Splash页面,欢迎页面)全屏保留状态栏文字(页面上部有Banner图)标题栏与状态栏颜色一致(部分App风格)不同Fragment中对StatusBar的处理不一样设置状态栏文字的颜色切换fragment时,toolBar显示与否、statusbar显示与否、statusBar颜色、statusBar文字颜色(新增)思考题Activity中window是怎么回事?...

weixin_34959771的博客 152

Android 关于状态栏开发的几件事,Android面试题目

方式有三种 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fullscreen_no_text); //方式一 //getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //方式二 //getWi

m0_64604636的博客 398
上一篇: zipfile 中的一些坑
下一篇: 小米8刘海屏适配
Magic1an
博客等级 码龄9年 7粉丝 24原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值