首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将fitsSystemWindows设置为true时,CollapsingToolbarLayout内部的ViewGroup会显示额外的底部填充

fitsSystemWindows 是一个用于 Android 开发中的属性,通常用于控制布局如何与系统窗口(如状态栏和导航栏)进行交互。当设置为 true 时,该布局会尝试为系统窗口留出空间,这通常用于实现沉浸式状态栏的效果。

基础概念

  • fitsSystemWindows: 这是一个布尔值属性,当设置为 true 时,布局会考虑系统窗口的尺寸,并为其留出空间。
  • CollapsingToolbarLayout: 这是 Android 支持库中的一个布局组件,用于实现可折叠的工具栏效果,常见于 Material Design 风格的应用中。

相关优势

  • 沉浸式体验: 通过正确设置 fitsSystemWindows,可以实现应用内容与系统窗口的无缝融合,提供更好的用户体验。
  • 灵活的布局调整: 根据系统窗口的变化,动态调整布局,确保内容始终可见且布局美观。

类型与应用场景

  • 类型: 这是一个布局属性,适用于所有需要与系统窗口进行交互的布局。
  • 应用场景: 主要用于实现沉浸式状态栏、导航栏以及与这些系统窗口紧密相关的布局调整。

问题与解决方案

当你将 fitsSystemWindows 设置为 true 时,CollapsingToolbarLayout 内部的 ViewGroup 可能会出现额外的底部填充。这是因为系统窗口(如导航栏)占据了部分屏幕空间,而布局试图适应这种变化。

原因

  • 系统窗口(如导航栏)占据了一部分屏幕空间。
  • fitsSystemWindows 属性导致布局尝试为这些系统窗口留出空间。

解决方案

  1. 调整布局参数: 仔细检查并调整 CollapsingToolbarLayout 及其内部视图的布局参数,确保它们正确地适应屏幕尺寸和系统窗口的变化。
  2. 使用 CoordinatorLayout: 确保 CollapsingToolbarLayoutCoordinatorLayout 的子视图,并正确配置它们之间的交互。
  3. 动态调整填充: 在代码中动态获取系统窗口的尺寸,并相应地调整布局的填充。

示例代码

以下是一个简单的示例,展示如何在代码中动态调整填充:

代码语言:txt
复制
// 获取系统窗口的尺寸
int statusBarHeight = getStatusBarHeight(this);
int navigationBarHeight = getNavigationBarHeight(this);

// 调整 CollapsingToolbarLayout 内部的填充
ViewGroup.LayoutParams params = collapsingToolbarLayout.getLayoutParams();
params.bottomMargin = navigationBarHeight;
collapsingToolbarLayout.setLayoutParams(params);

// 辅助方法:获取状态栏高度
public static int getStatusBarHeight(Context context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

// 辅助方法:获取导航栏高度(注意:此方法可能不适用于所有设备)
public static int getNavigationBarHeight(Context context) {
    int result = 0;
    if (hasNavBar(context)) {
        Resources res = context.getResources();
        int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = res.getDimensionPixelSize(resourceId);
        }
    }
    return result;
}

// 辅助方法:检查设备是否有导航栏
public static boolean hasNavBar(Context context) {
    boolean hasNavBar = false;
    Resources rs = context.getResources();
    int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
    if (id != 0) {
        hasNavBar = rs.getBoolean(id);
    }
    try {
        Class<?> systemPropertiesClass = Class.forName("android.os.SystemProperties");
        Method m = systemPropertiesClass.getMethod("get", String.class);
        String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
        if ("1".equals(navBarOverride)) {
            hasNavBar = false;
        } else if ("0".equals(navBarOverride)) {
            hasNavBar = true;
        }
    } catch (Exception e) {
        // 忽略异常
    }
    return hasNavBar;
}

参考链接

请注意,上述代码中的 getNavigationBarHeighthasNavBar 方法可能需要根据具体设备和 Android 版本进行调整。在实际应用中,建议进行充分的测试以确保兼容性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Material Design 实战 之 第六弹 —— 可折叠式标题栏(CollapsingToolbarLayout) & 系统差异型的功能实现(充分利用系统状态栏空间)

充分利用系统状态栏空间(系统差异型) 2.1 将控件(这里是ImageView)布局结构中的所有父布局的 android:fitsSystemWindows属性指定成true,...接着还可以在界面上再添加一个悬浮按钮, 当然并不是必需的,只是如果加的话,我们将免费获得一些额外的动画效果。...FloatingActionButton中, app:layou_anchor属性(anchor n.锚状物)指定了一个锚点,这里将锚点设置为AppBarLayout,这样悬浮按钮就会出现在水果标题栏的区域内..., 将控件的android:fitsSystemWindows属性指定成true,就表示该控件会出现在系统状态栏里。...这里除了将android:fitsSystemWindows属性设置好,还必须在程序的主题中将状态栏颜色指定成透明色。

2.3K40
  • 再学一遍android:fitsSystemWindows属性

    对于android:fitsSystemWindows这个属性你是否感觉又熟悉又陌生呢? 熟悉是因为大概知道它可以用来实现沉浸式状态栏的效果,陌生是因为对它好像又不够了解,这个属性经常时灵时不灵的。...我相信按照绝大多数人的美好设想,android:fitsSystemWindows属性就应该像是一个开关一样,设置成true就可以打开沉浸式状态栏效果,设置成false就可以关闭沉浸式状态栏效果。...在Google提供的诸多布局当中,并不是只有CoordinatorLayout会处理android:fitsSystemWindows属性,像CollapsingToolbarLayout、DrawerLayout...CollapsingToolbarLayout,并且给CollapsingToolbarLayout也设置了android:fitsSystemWindows属性,这样CollapsingToolbarLayout...接着我们给ImageView同样设置了android:fitsSystemWindows属性,如此一来,就可以让图片显示在状态栏的背后了。

    1.3K50

    CoordinatorLayout使用全解析

    例如,如果视图只有底部25%显示,它将折叠。相反,如果它的底部75%可见,那么它将完全展开。...CollapsingToolbarLayout可以通过app:contentScrim设置折叠时工具栏布局的颜色,通过app:statusBarScrim设置折叠时状态栏的颜色。...CollapsingToolbarLayout的子布局有3种折叠模式(Toolbar中设置的app:layout_collapseMode) off:默认属性,布局将正常显示,无折叠行为。...pin:CollapsingToolbarLayout折叠后,此布局将固定在顶部。 parallax:CollapsingToolbarLayout折叠时,此布局也会有视差折叠效果。...当CollapsingToolbarLayout的子布局设置了parallax模式时,我们还可以通过app:layout_collapseParallaxMultiplier设置视差滚动因子,值为:0~

    2.2K20

    使用CoordinatorLayout打造各种炫酷的效果

    版权声明:本文为博主原创文章,未经博主允许不得转载。...(当这个View到达 CollapsingToolbarLayout的底部的时候,这个View 将会被放置,即代替整个CollapsingToolbarLayout) 我们有两种方法可以设置这个常量,...的底部的时候,会代替整个CollapsingToolbarLayout显示 接着说明TabLayout的变化 从前面的描述我们已经知道当 没有指定app:layout_scrollFlags的时候,最终...TabLayout会静止,不会随着滑动的 时候消失不见 拓展 如果我们仅仅 改变CollapsingToolbarLayout的app:layout_scrollFlags=”scroll|exitUntilCollapsed...- 对于AppBarLayout,我们主要 讲解了这个属性app:layout_scrollFlags,设置不同 的属性我们可以在滚动的时候显示不同 的效果 - 对于CollapsingToolbarLayout

    5K10

    高仿支付宝9.9.2版本生活模块界面来讲解CoordinatorLayout,AppBarLayout,CollapsingToolbarLayout

    内部的子View通过在布局中加app:layout_scrollFlags设置执行的动作。...最后snap这是属性是子View不会存在局部显示的情况,滚动Child View的部分高度,当我们松开手指时,Child View要么向上全部滚出屏幕,要么向下全部滚进屏幕。...3.CollapsingToolbarLayout 是用来对Toolbar进行再次包装的ViewGroup,主要是用于实现折叠的App Bar效果。...CollapsingToolbarLayout只要有这方面: 1.title展开时是最大的,然后随着收缩会越来越少,直到屏幕的顶部,通过app:title设置title,不然就默认。...当verticalOffset=0的时候即使整个展开的是时候要做的就是显示要显示的,隐藏要隐藏的设置,在设置透明度,同理当verticalOffset等于appBarLayout.getTotalScrollRange

    1.1K20

    CoordinatorLayout与滚动的处理

    目前这个框架提供了几种不用写动画代码就能工作的方法,这些效果包括: 让浮动操作按钮上下滑动,为Snackbar留出空间 ? 扩展或者缩小Toolbar或者头部,让主内容区域有更多的空间。 ?...floatingActionButton弹出Snackbar,fab自动上移的效果,app:layout_behavior的为自定义的效果,当下滑时,fab消失,上滑时fab显示,详情请查看本人博客 Floating...通常,我们我们都是设置Toolbar的title,而现在,我们需要把title设置在CollapsingToolBarLayout上,而不是Toolbar。...同时在用户滚动的时候title的高度也会随着改变。 ? 为了制造出这种效果,我们添加一个定义了app:layout_collapseMode=”parallax” 属性的ImageView。...当滚动发生的时候,CoordinatorLayout会尝试触发那些声明了依赖的子view。

    80720

    CollapsingToolbarLayout使用

    ,直至高度缩为Toolbar的高度并成为Toolbar的背景色;向下滑动列表时,Header部分逐渐显示。...关于CollapsingToolbarLayout的属性在官网上可以查到,这里我只介绍案例中我们常用的几个属性:title标题,布局展开时放大显示在图片底部,布局折叠时缩小显示在Toolbar左侧。...attr/colorPrimary",即显示为Toolbar颜色,应用的主题色;layout_collapseMode折叠模式,设置其他控件滚动时自身的交互行为,有两种取值:parallax,折叠视差效果...当设置为1.0,滚动列表时图片不会折叠移动; 代码实现: 关于CoordinatorLayout作为根布局容器如何协调子控件之间的交互行为,可以参考上一篇文章,这里我介绍一下本例中几个新的注意点。...表示控件向上折叠退出并以最小高度停留在顶部;前面介绍CollapsingToolbarLayout属性时介绍到了statusBarScrim的使用,其实也可以通过android:fitsSystemWindows

    2.5K60

    细说 AppbarLayout,如何理解可折叠 Toolbar 的定制

    当 AppBarLayout 中的内容要从 CoordinatorLayout 外面进入内部时,我们用 enter 指代这种行为,对应的手势就是向下滑动。...当 AppBarLayout 中的内容从 CoordinatorLayout 内部向外部方向移动时,我们用 exit 指代这种行为,对应的手势是向上滑动。...Toolbar 先滑动,等到视图可见范围高度为 collapsed 指定高度时它会静止,等到 NestedScrollView 内容完全显示在 Toolbar 下方时它再一起滑动,它的动作是 3 段式的...说的是包裹 CollapsingToolbarLayout 的 AppbarLayout 需要设置 fitsSystemWindows 为 true。...Pinned position children 子类的位置固定行为 这个很好理解,将 CollapsingToolbarLayout 中某个子 View 固定,无论是否存在滚动事件,只要设置 app:

    3.1K30

    第14章 使用Kotlin 进行 Android 开发(1)第14章 使用Kotlin 进行 Android 开发(1)

    最终的运行效果如下 ? HelloWord.png 14.2 综合项目实战:开发一个电影指南应用程序 本节我们将开发一个Android 应用程序, 列出流行/最高评级的电影, 显示预告片和评论。...另外,它还生成一个本地视图缓存,当第一次使用属性时,它将执行一个常规的findViewById。但在下一次使用属性的时候,视图将从缓存中恢复,因此访问速度将更快。...setCustomAnimations(int enter, int exit) 为Fragment的进入/退出设置指定的动画资源。 commit() 提交事务。安排一个针对该事务的提交。...将 Fragment 添加至 Activity 的视图布局中有两种方式:一种是使用fragment标签加入,Fragment的父视图应是一个ViewGroup;另一种使用代码动态加入,并将一个ViewGroup...由于平板比手机屏幕大的多,因此平板上可以呈现更多的内容,而 Fragment 可以实现同一视图布局在不同大小的屏幕上显示不同的效果,将 Fragment 加入到 Activity 的 Layout 中,

    2.8K30

    Material Design之CollapsingToolbarLayout 相关属性和方法介绍

    设置边界距离 和 textview等效果一样 6.android.support.design:expandedTitleMarginBottom  底部的margin距离 7.android.support.design...如果标题可用的话 显示的标题文字    11.android.support.design:titleEnabled e.g. app:titleEnabled="true" Whether the...enterAlwaysCollapsed - 当你的View已经设置minHeight属性又使用此标志时,你的View只能以最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。...--layout_collapseMode (折叠模式) - 有两个值: pin - 设置为这个模式时,当CollapsingToolbarLayout完全收缩后,Toolbar...parallax - 设置为这个模式时,在内容滚动时,CollapsingToolbarLayout中的View(比如ImageView)也可以同时滚动,实现视差滚动效果,通常和layout_collapseParallaxMultiplier

    96730

    NestedScrollView 嵌套 ListView 实现滑动折叠效果

    当我们引入RecyclerView的时候,恰好是压死骆驼的最后一根稻草,故不得不采用其他方案来代替RecyclerView 和 CollapsingToolbarLayout实现的折叠效果。...android:fitsSystemWindows,经本人代码测试,表示CollapsingToolbarLayout的上边界是否扩展到statusbar,这里如果想使用透明的statusbar,这里更新下应该该布局的根布局的该属性为...enterAlways - 实现quick return效果, 当向下移动时,立即显示View(比如Toolbar). exitUntilCollapsed - 向上滚动时收缩View,但可以固定Toolbar...enterAlwaysCollapsed - 当你的View已经设置minHeight属性又使用此标志时,你的View只能以最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。...解决方法在AppBarLayout添加 android:fitsSystemWindows="true"

    3.5K50

    android 设置标题栏背景颜色_状态栏菜单栏都在哪

    android:fitsSystemWindows=”true”属性就可以了,要不布局会跑到状态栏和导航栏下面,与导航栏和状态栏重叠,这当然不是我们希望的。...同一个Activity包含多个Fragment时,如何实现不同fragment的状态栏背景和文字颜色不一样 如下面的效果图: 就是设置了状态栏为暗色后,还得设置回来,这其实主要靠下面两个flag...(0, 0, 0, CommonUtils.navigationHeight); 这行代码干什么用的,因为我们这里首页和我的页面,需要背景图片填充到状态栏,故不能使用android:fitsSystemWindows...带有底部导航栏手机底部导航按钮会和navigationbar重叠 如下图所示: 全屏时,由于视图布局会填充到状态栏和导航栏下方,如果不使用android:fitsSystemWindows=”true...上面对于版本的判断,如果android版本大于4.4, 则让该布局显示出来,而版本低于4.4, 由于没有沉浸式状态栏效果,则不需要给界面设置占空布局。

    2.3K10

    全屏、沉浸式、fitSystemWindow使用及原理分析:全方位控制“沉浸式”的实现

    可以这么理解:状态栏与导航栏拥有自己独立的窗口,而且这两个窗口的优先级较高,会悬浮在所有窗口之上,可以把系统自身的状态栏与导航栏看做全透明的,之所有会有背景颜色,是因为下层显示界面在被覆盖的区域添加了颜色...--关键点1 ,可以看到,根布局会根据消耗的状况,来评估到底底部,右边部分margin多少,并设置进去--> if (mContentRoot !...会选择性进入设置了fitSystemWindow的View,即设置了fitsSystemWindows: android:fitsSystemWindows="true" 并回调fitSystemWindows...有一个小点需要注意下,那就是Theme中也支持fitsSystemWindows的设置 fitsSystemWindows">true 默认情况下上属性为...false,如果设置了True,就会被第一个未设置fitsSystemWindows的View消费掉。

    5.8K40

    Android - 仿网易云音乐歌单详情页

    : 实现思路: 1、Activity设置自定义Shared Element切换动画 2、透明状态栏(透明Toolbar,使背景图上移) 3、Toolbar底部增加和背景一样的高斯模糊图,并上移图片(为了使背景图的底部作为...其中内容根布局不要设置android:fitsSystemWindows="true",这样会额外添加一个状态栏。...其中StatusBarUtil,是一个为Android App 设置状态栏的工具类。...3、Toolbar的背景图 仔细分析后发现网易云音乐的Toolbar的背景其实显示的是高斯模糊图的底部,所以这里基本套路是Toolbar是透明的,后面背景图取的是高斯模糊图的底部一部分。 ?...Toolbar背景图 监听图片显示,在显示之后将其设置为透明色,然后在滑动的时候渐变。

    1.4K10

    ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

    总结 当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View,TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由...解决思路 看了上面三种情况,我们知道他们的共同特点是父View 和子View都想争着响应我们的触摸事件,但遗憾的是我们的触摸事件 同一时刻只能被某一个View或者ViewGroup拦截消费,所以就产生了滑动冲突...那既然同一时刻只能由某一个View或者ViewGroup消费拦截,那我们就只需要 决定在某个时刻由这个 View 或者 ViewGroup 拦截事件,另外的 某个时刻由 另外一个 View 或者 ViewGroup...,滚动条自然就显示到顶部了。...(true); view.requestFocus(); 这段代码在初始化的时候就让该界面的顶部的某一个控件获得焦点,滚动条自然就显示到顶部了。

    5.8K51

    通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout

    Scroll: 表示向下滚动时,这个View会被滚出屏幕范围直到隐藏. enterAlways: 表示向上滚动时,这个View会随着滚动手势出现,直到恢复原来的位置. enterAlwaysCollapsed...CollapsingToolbarLayout的子View中可以设置这两个属性 1、ayout_collapseMode (折叠模式) - 有两个值: pin - 设置为这个模式时,当CollapsingToolbarLayout...parallax - 设置为这个模式时,在内容滚动时,CollapsingToolbarLayout中的View(比如ImageView)也可以同时滚动,实现视差滚动效果,通常和layout_collapseParallaxMultiplier...(还没有收缩时)title向左填充的距离 app:expandedTitleMarginEnd 这个同理是收缩结束时向左填空的距离 其他的就不一一介绍了,具体的去查看API文档即可获知。...我在做这里的时候遇到一个问题,那就是CollapsingToolbarLayout里的Title的问题,一般默认是显示的,即使你不写,它也有会一个默认值一直显示在那里,等折叠收缩完的时候,停留在标题工具栏上

    2.3K90

    Android 沉浸式状态栏的多种样式

    ---- 公共的步骤: 布局文件中添加使用 Toolbar 控件(纯色 Toolbar 背景色为颜色,图片 Toolbar 样式设置背景色为图片或添加一个 ImageView 控件),在文件根布局与 Toolbar...中添加 android:fitsSystemWindows="true",这个很重要,可以使背景图片延伸至状态栏,当然在 Java 文件中设置一样的效果; <?...被遮挡操作栏 Toolbar 在测试过程中会出现底部虚拟操作按纽栏目被隐藏,如下图,此时应注意设置 systemUiVisibility 属性。...测试发现,若将根布局的高设为 android:layout_height="wrap_content" 时图片正常展示,如果为 android:layout_height="match_parent"...则图片会被拉伸,当然和尚我认为根布局设置为 wrap_content 方式是不合理的。

    1.5K41
    领券