iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android中关于CoordinatorLayout的一些实用布局技巧
  • 307
分享到

Android中关于CoordinatorLayout的一些实用布局技巧

技巧布局coordinatorlayoutAndroid 2022-06-06 11:06:25 307人浏览 泡泡鱼
摘要

介绍 CoordinatorLayout是一个“加强版”的 FrameLayout,它主要有两个用途: (1) 用作应用的顶层布局管理器 (2) 通过为子View指定 be

介绍

CoordinatorLayout是一个“加强版”的 FrameLayout,它主要有两个用途:

(1) 用作应用的顶层布局管理器

(2) 通过为子View指定 behavior 实现自定义的交互行为。

在我们做 Material Design 风格的app时通常都使用 CoordinatorLayout 作为布局的根节点,以便实现特定的UI交互行为。
那么现在我们来看看如何用已有的一些控件实现一些常见的布局。

Toolbar + TabLayout 实现 TabLayout 置顶效果

很常见的一种模式是 TabLayout 放在 ToolBar 布局中与其一起置顶在界面上方,而现在的效果是将ToolBar 隐藏而 TabLayout一直置顶在界面上方。


tablayout

如何实现呢?首先所在的 Activity 要使用 AppTheme.NoActionBar 风格主题,之后再编写布局文件。


<Android.support.design.widget.CoordinatorLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <android.support.design.widget.AppBarLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:theme="@style/AppTheme.AppBarOverlay">
 <android.support.v7.widget.Toolbar
  android:id="@+id/toolbar"
  android:layout_width="match_parent"
  android:layout_height="?attr/actionBarSize"
  android:background="?attr/colorPrimary"
  app:layout_scrollFlags="scroll|enterAlways|snap"
  app:popupTheme="@style/AppTheme.PopupOverlay">
  <!-- toolbar内部布局文件 -->
 </android.support.v7.widget.Toolbar>
 <android.support.design.widget.TabLayout
  android:id="@+id/tab_layout"
  android:layout_width="match_parent"
  android:layout_height="@dimen/tab_height"
  app:tabIndicatorColor="@color/white"
  app:tabTextColor="@color/white_nORMal">
 </android.support.design.widget.TabLayout>
 </android.support.design.widget.AppBarLayout>
 <!-- 主界面布局文件 -->
</android.support.design.widget.CoordinatorLayout>

很重要的两点:

设置 Toolbar 的
layout_scrollFlags="scroll|enterAlways|snap"
保证 Toolbar 能随界面滑动向上隐藏。 TabLayout 与 Toolbar 同级,父节点为 AppBarLayout ,保证 TabLayout 能够能够显示在 Toolbar 外面而不随其一起隐藏。

浸入式 + CollapsingToolbarLayout

CollapsingToolbarLayout 可以包裹 Toolbar , 当其显示完收缩动画时使 Toolbar 显示在顶端。而我们可以再加入浸入式的效果让 CollapsingToolbarLayout 的背景图突破系统的状态栏使界面更加美观同时也不影响 Toolbar 的显示效果。


浸入式布局

在实现布局文件前要赋予当前的Activity主题为AppTheme.Immersive。

其样式要在 v19 与 v21 分别处理,至于v19之前的 android 版本那就无能为力了。

v19


<style name="AppTheme.Immersive" parent="AppTheme.NoActionBar">
 <item name="android:windowTranslucentStatus">true</item>
</style>

v21


<style name="AppTheme.Immersive" parent="AppTheme.NoActionBar">
 <!--透明导航栏-->
 <item name="android:statusBarColor">@android:color/transparent</item>
 <item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>

之后再来看布局文件,包括了 AppBarLayout,CollapsingToolbarLayout 和 Toolbar 这些控件。

同样也是要分为 v19 和 v21 两种布局

v19


<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:layout_height="match_parent">
 <android.support.design.widget.AppBarLayout
  android:id="@+id/app_bar"
  android:layout_width="match_parent"
  android:layout_height="220dp"
  android:theme="@style/AppTheme.AppBarOverlay">
  <android.support.design.widget.CollapsingToolbarLayout
   android:id="@+id/collapsing_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   app:contentScrim="?attr/colorPrimary"
   app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
   app:statusBarScrim="@android:color/transparent"
   app:titleEnabled="false">
   <RelativeLayout
    android:id="@+id/anime_root"
    android:layout_width="match_parent"
    android:layout_height="220dp"
    app:layout_collapseMode="parallax"
    app:layout_collapseParallaxMultiplier="0.7">
    <!-- 可伸缩背景图布局文件 -->
   </RelativeLayout>
   <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_marginTop="25dp"
    app:layout_collapseMode="pin"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:titleMarginTop="15dp" />
  </android.support.design.widget.CollapsingToolbarLayout>
 </android.support.design.widget.AppBarLayout>
 <!-- 界面布局文件 -->
</android.support.design.widget.CoordinatorLayout>

v21


<android.support.design.widget.CoordinatorLayout 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:layout_height="match_parent"
 android:fitsSystemwindows="true">
 <android.support.design.widget.AppBarLayout
  android:id="@+id/app_bar"
  android:layout_width="match_parent"
  android:layout_height="220dp"
  android:fitsSystemWindows="true"
  android:theme="@style/AppTheme.AppBarOverlay">
  <android.support.design.widget.CollapsingToolbarLayout
   android:id="@+id/collapsing_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:fitsSystemWindows="true"
   app:contentScrim="?attr/colorPrimary"
   app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
   app:statusBarScrim="@android:color/transparent"
   app:titleEnabled="false">
   <RelativeLayout
    android:id="@+id/anime_root"
    android:layout_width="match_parent"
    android:layout_height="220dp"
    android:fitsSystemWindows="true"
    app:layout_collapseMode="parallax"
    app:layout_collapseParallaxMultiplier="0.7">
    <!-- 可伸缩背景图布局文件 -->
   </RelativeLayout>
   <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:layout_collapseMode="pin"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:titleMarginTop="15dp" />
  </android.support.design.widget.CollapsingToolbarLayout>
 </android.support.design.widget.AppBarLayout>
 <!-- 界面布局文件 -->
</android.support.design.widget.CoordinatorLayout>

那么重点在哪里呢?

设置你当前的 Activity 的状态栏为透明,4.4之前的机型则无法适配。 注意每个控件下的 fitsSystemWindows 属性,使系统能够调整 view 的 padding 值使其适配。 设置 CollapsingToolbarLayout 为可滚动(scroll),滚动结束后可以设置 statusBarScrim 作为覆盖色。 背景布局与 Toolbar 同级,布局文件上可以设置滚动的模式,如视差滚动及相应的值。 注意到 v19 的布局文件上的 Toolbar ,给它赋予了一个 android:layout_marginTop="25dp"的属性,以便在Android 4.4上时防止被系统的状态栏所覆盖。当然这个值可以在代码中获取到系统状态栏高度再进行设置。

fitsSystemWindows详解:这个一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为true,就会调整view的paingding属性来给system windows留出空间。

Fragment + 不同风格布局

有时候产品要求在一个 Activity 上显示不同的 Fragment 界面,且 Fragment 上的每一个头部样式都不一样,比如说一个是普通情况下的 Toolbar,另一个却是浸入式的可伸缩头部,像简书app的首页

额,我们先不提图中的那个bug,图中的界面主要是两种效果,一个为普通的标题栏+正文,另一个则是浸入式的图片背景+正文。我们也可以利用浸入式的主题来仿照出简书的效果。


各个页面不同样式

第一步要做的是给 Fragment 所在的 Activity 套上 AppTheme.Immersive 浸入式主题样式,之后为 Activity 加上布局


<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <com.ashokvarma.bottomnavigation.BottomNavigationBar
  android:id="@+id/bottom_navigation_bar"
  android:layout_width="match_parent"
  android:layout_height="56dp"
  android:layout_gravity="bottom"
  android:fitsSystemWindows="true">
 </com.ashokvarma.bottomnavigation.BottomNavigationBar>
 <android.support.v4.view.ViewPager
  android:id="@+id/viewpager"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_marginBottom="56dp" />
</android.support.design.widget.CoordinatorLayout>

无他,就是一个 ViewPager 容器用来加载 Fragment。

书城所在的 Fragment 布局如下:


<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:fitsSystemWindows="true">
 <android.support.design.widget.AppBarLayout
  android:id="@+id/app_bar"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:fitsSystemWindows="true"
  android:theme="@style/AppTheme.AppBarOverlay">
  <android.support.design.widget.CollapsingToolbarLayout
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:fitsSystemWindows="true"
   app:contentScrim="?attr/colorPrimary"
   app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
   app:statusBarScrim="@android:color/transparent"
   app:titleEnabled="false">
   <!-- 背景布局 -->
   <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="36dp"
    android:minHeight="36dp"
    app:layout_collapseMode="pin"
    app:popupTheme="@style/AppTheme.PopupOverlay">
    <!-- 搜索框布局 -->
   </android.support.v7.widget.Toolbar>
  </android.support.design.widget.CollapsingToolbarLayout>
 </android.support.design.widget.AppBarLayout>
 <!-- 界面主布局 -->
</android.support.design.widget.CoordinatorLayout>

布局跟之前的浸入式布局相同,但单单这样布局是有问题的,此时的 Toolbar 会显示在系统的状态栏下。所以我们要修正 Toolbar 的摆放位置,即人为的为其设置 MarginTop 距离。



protected void fixToolbar(Toolbar toolbar) {
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  int statusHeight = getStatusBarHeight(getActivity());
  ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams();
  layoutParams.setMargins(0, statusHeight, 0, 0);
 }
}

public int getStatusBarHeight(Context context) {
 Class<?> c = null;
 Object obj = null;
 Field field = null;
 int x = 0, statusBarHeight = 0;
 try {
  c = Class.forName("com.android.internal.R$dimen");
  obj = c.newInstance();
  field = c.getField("status_bar_height");
  x = Integer.parseInt(field.get(obj).toString());
  statusBarHeight = context.getResources().getDimensionPixelSize(x);
 } catch (Exception e1) {
  e1.printStackTrace();
 }
 return statusBarHeight;
}

在每个 Fragment 初始化 Toolbar 时都需要调用这个方法来修正位置。

重点又来了:

修改为浸入式样式主题,要点见上一个案例。 人为修正 Toolbar 的距离,保证位置摆放正确。 注意 Fragment 切换时偶尔出现的一些 Toolbar 问题。

Fragment 与 Toolbar 的选项菜单问题

在 Fragment 之间切换的时候很容易遇到 Toolbar 上的菜单无法正确的显示的问题,解决方法也很简单,在 Fragment 的 onCreateView() 方法中添加一行代码:


toolbar.setTitle("title");
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
fixToolbar(toolbar);
setHasOptionsMenu(true); //重要的一行代码,防止选项菜单错乱

总结

自从 Google 出了 com.android.support:design 包之后,其多样化的定制给 App 应用带来更加酷炫的效果,布局的变化只不过是其中的一部分而已。文章的开头也说了, CoordinatorLayout 不止是带来了布局的变化,也带给了控件更多的UI交互动作。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程网的支持。

您可能感兴趣的文章:Android 使用CoordinatorLayout实现滚动标题栏效果的实例Android CoordinatorLayout详解及实例代码Android 5.0中CoordinatorLayout的使用技巧CoordinatorLayout的使用如此简单(Android)详解android特性之CoordinatorLayout用法探析实例


--结束END--

本文标题: Android中关于CoordinatorLayout的一些实用布局技巧

本文链接: https://www.lsjlt.com/news/28430.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • android布局优化的技巧有哪些
    以下是一些优化Android布局的技巧:1. 使用ConstraintLayout:ConstraintLayout可以帮助创建复杂...
    99+
    2023-10-09
    android
  • CSS网页布局的实用技巧有哪些
    本篇内容主要讲解“CSS网页布局的实用技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS网页布局的实用技巧有哪些”吧!   1、ul标签在Mozi...
    99+
    2024-04-02
  • CSS居中布局的技巧有哪些
    本篇内容主要讲解“CSS居中布局的技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS居中布局的技巧有哪些”吧!水平居中元素:方式一:CSS3 tra...
    99+
    2024-04-02
  • 关于Android下常用布局的LayoutParams的用法
    在Android中,LayoutParams是用来设置View在布局中的位置和大小的对象。LayoutParams通常是一个特定布局...
    99+
    2023-08-24
    Android
  • android布局优化的一些实用建议
    前言 Android的绘制优化其实可以分为两个部分,即布局(UI)优化和卡顿优化,而布局优化的核心问题就是要解决因布局渲染性能不佳而导致应用卡顿的问题,所以它可以认为是卡顿优化的一...
    99+
    2024-04-02
  • Java中关于关键字使用的一些技巧,你了解吗?
    Java是一种高度常用的编程语言,其中关键字的使用在程序开发过程中起着至关重要的作用。本文将介绍一些Java中关于关键字使用的技巧,帮助读者更好地理解和运用Java编程语言。 一、final关键字的使用 在Java中,final关键字表示不...
    99+
    2023-07-09
    关键字 数组 开发技术
  • 实现响应式布局的关键原则和实际技巧
    响应式布局的核心原理与实践技巧 现如今,移动设备的普及使得人们对网站的访问途径多种多样。因此,网站的响应式布局成为了必备的设计实践。响应式布局可以适应不同的设备,从而提供更好的用户体验。本文将介绍响应式布局的核心原理与实践技巧,...
    99+
    2024-01-29
    实践技巧 响应式布局 核心原理
  • CSS技巧:如何实现居中对齐的布局
    在网页设计中,居中对齐的布局经常被使用。无论是居中对齐文字、图片、还是整个页面布局,都可以通过CSS来实现。本文将介绍几种实现居中对齐的布局的CSS技巧,并提供具体的代码示例。首先,我们来看如何实现水平居中对齐的布局。下面是一些常见的元素的...
    99+
    2023-10-21
    CSS 布局 居中
  • 掌握响应式布局的关键技巧和实践经验
    掌握响应式布局的关键技巧和实践经验 随着移动设备的普及和多样性,越来越多的用户选择使用手机、平板等移动设备浏览网页,这就使得响应式布局成为了现代前端开发中的重要技术之一。响应式布局的目...
    99+
    2024-02-22
    响应式设计 实践经验 布局技巧 弹性布局 延迟加载
  • CSS让前端网页布局更好的实用技巧有哪些
    本篇内容介绍了“CSS让前端网页布局更好的实用技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • Python中关于property使用的小技巧
    目录property属性具体实例property属性的有两种方式装饰器方式旧式类新式类类属性方式property对象与@property装饰器对比property对象类属性@prop...
    99+
    2024-04-02
  • 响应式布局中使用HTML固定定位的实用技巧
    HTML固定定位在响应式布局中的应用技巧,需要具体代码示例 随着移动设备的普及和用户对响应式布局的需求增加,开发人员在网页设计中遇到了更多的挑战。其中一个关键问题就是如何实现固定定位,以确保在不同屏幕尺寸下,元素能够固定在页面的...
    99+
    2024-01-20
    html 响应式布局 定位
  • 关于WinXP系统任务管理器的一些应用或技巧
    任务栏管理器系统自带的一个很方便的软件。长久以来,大家也仅仅是习惯性的点击ctrl+alt+del来调出任务管理器了,然后取消某个失去相应的程序而已。其实任务管理器很强大的,它能很直观反映有系统的许多的东西,并且可以很方...
    99+
    2023-06-01
    WinXP 任务管理器 任务 管理器 系统 应用
  • 使用CSS实现响应式卡片瀑布流布局的技巧
    使用CSS实现响应式卡片瀑布流布局的技巧随着移动设备的普及和网页内容的多样化,响应式设计已经成为现代web开发的基本要求之一。其中,卡片式布局和瀑布流布局都逐渐成为广受欢迎的设计风格。本文将介绍如何使用CSS实现一个响应式的卡片瀑布流布局,...
    99+
    2023-11-21
    响应式 CSS 瀑布流布局
  • 使用CSS实现响应式瀑布流卡片布局的技巧
    使用CSS实现响应式瀑布流卡片布局的技巧,需要具体代码示例在当今移动设备普及的时代,响应式设计已经成为现代网站的必备要素之一。而响应式瀑布流卡片布局作为一种流行的布局方式,可以在不同屏幕尺寸下实现流畅的展示效果。本文将介绍如何使用CSS实现...
    99+
    2023-11-21
    响应式 CSS 瀑布流布局
  • 关于Python中进度条的六个实用技巧分享
    目录1 简介2 tqdm中实用的6个特性2.1 autonotebook自动切换进度条风格2.2 延迟渲染进度条2.3 自定义进度条色彩2.4 自主控制的进度上限2.5 针对enum...
    99+
    2024-04-02
  • 使用CSS实现响应式图片卡片布局的技巧
    使用CSS实现响应式图片卡片布局的技巧随着移动设备的普及和网络速度的提升,人们在浏览网页时越来越重视页面的响应式布局。作为页面设计的关键元素之一,图片在响应式布局中扮演着重要角色。本文将介绍一种使用CSS实现响应式图片卡片布局的技巧,帮助你...
    99+
    2023-11-21
    响应式 CSS 技巧 布局 图片卡片
  • Android应用中怎么实现一个跟踪布局效果
    这篇文章给大家介绍Android应用中怎么实现一个跟踪布局效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首页Activitypublic class TraceActivity extends AppCompatA...
    99+
    2023-05-31
    android roi
  • android应用中怎么利用onLayout()实现一个流式布局
    这期内容当中小编将会给大家带来有关android应用中怎么利用onLayout()实现一个流式布局,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在onLayout方法中有四个参数,我画了一个简单的图来分清...
    99+
    2023-05-31
    android roi onlayout()
  • 使用position属性实现多列布局的方法和技巧
    如何使用position属性实现多列布局在Web开发中,实现多列布局是非常常见的需求。使用position属性可以轻松地实现这一目标,本文将介绍如何使用position属性来实现多列布局,并提供具体的代码示例。在开始之前,我们先来了解一下p...
    99+
    2023-12-26
    多列布局 位置属性CSS
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作