使用Kotlin的Android CoordinatorLayout

时间:2020-02-23 14:28:50  来源:igfitidea点击:

在本教程中,我们将使用Kotlin在Android应用程序中讨论CoordinatorLayout。

CooridinatorLayout

过去我们讨论过FrameLayouts。
CoordinatorLayout是具有更多属性的超级功能FrameLayouts。
属性例如:

  • 根据对视图执行的操作在布局上设置某些行为。

  • 根据某些操作设置相互依赖的视图。
    一个视图充当另一个视图的layout_anchor。
    这样,我们可以定义一个视图在另一个视图改变时如何改变。

Basically, this is useful in animating views related to one another.

创建一个全新的android studio项目,然后选择基本活动类型。
不要忘记启用Kotlin支持!

在布局文件夹中,您将拥有两个文件" activity_main.xml"和" content_main.xml"。
" content_main.xml"是" activity_main.xml"布局的一部分,并包含在<include>标签中

以下是这些XML布局的每个样子:

activity_main.xml

默认情况下,CoordinatorLayout由AppBarLayout和FloatingActionButton组成。
这些是材料设计支持库的一部分。

AppBarLayout

AppBarLayout用于保存工具列。
那些工具列将使AppBarLayout想要的方式具有动画效果。
AppBarLayout本身是垂直的LinearLayout。
为了向子视图提供所需的滚动行为,我们需要在子视图上设置app:layout_scrollFlags。

app:layout_scrollFlags可以在工具列上设置。
它可以具有以下属性,

  • 滚动:通常为所有需要在屏幕外滚动的视图设置此标志。
    不使用此标志的视图保持静态,从而允许其他可滚动视图向后滑动

  • enterAlways:此标志确保任何向下滚动都将导致视图变为可见,从而启用快速返回模式

  • enterAlwaysCollapsed:" enterAlways"的附加标志,用于修改返回的视图,使其仅在最初滚动回其折叠高度。

  • exitUntilCollapsed:此标志使视图在退出之前一直滚动到收起(达到其minHeight)为止

  • snap:滚动结束后,如果视图仅部分可见,则将对其进行捕捉并滚动到最接近的边缘。
    因此,这避免了视图的中间动画状态

content_main.xml

现在忽略ConstraintLayout。
我们将在以后的教程中进行讨论。
请注意ʻapp:layout_behavior =" @ string/appbar_scrolling_view_behavior""。
它是在AppBarLayout下面滚动内容的标准滚动行为。

回到activity_main.xml,让我们看一些重要的XML属性

重要的XML属性

android:layout_gravity:指定子视图相对于父视图的重力。
如果使用" app_layoutAnchorGravity",则layout_gravity属性将设置相对于锚视图的重力。
app:layout_anchor用于设置当前子项的锚点视图。
该视图将相对放置。

app:layout_insetEdge用于设置视图上的插图。
这样就为视图锁定了一定的空间。
app:layout_dodgeInsetEdges用于设置视图在需要时是否愿意从一侧移开。
我们可以传递开始,结束,顶部或者底部。

FloatingActionButton具有默认的布局行为,该行为会在按下时向上移动以为SnackBar留出空间。

layout_insetEdge和layout_dodgeInsetEdges

让我们在activity_main.xml CoordinatorLayout中添加另一个按钮。

<?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"
  tools:context=".MainActivity">

  <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:popupTheme="@style/AppTheme.PopupOverlay" 

  </android.support.design.widget.AppBarLayout>

  <include layout="@layout/content_main" 

  <android.support.design.widget.FloatingActionButton
      android:id="@+id/fab"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="bottom|end"
      android:layout_margin="@dimen/fab_margin"
      app:srcCompat="@android:drawable/ic_dialog_email" 

  <Button
      android:layout_width="wrap_content"
      android:text="WATCH ME"
      android:layout_gravity="bottom|start"
      android:layout_height="wrap_content" 

</android.support.design.widget.CoordinatorLayout>

如您所见,Button隐藏,并且SnackBar显示在其上方。
要解决此问题,请将按钮更改为:

<Button
      android:layout_width="wrap_content"
      android:text="WATCH ME"
      android:layout_gravity="bottom|start"
      app:layout_dodgeInsetEdges="bottom"
      android:layout_height="wrap_content" 

因此,将" app:layout_dodgeInsetEdges"设置为底部,这在显示Snackbar时将按钮的底部从其位置移开。

将layout_insetEdges设置为Button的底部,您将看到FloatingActionButton在相同位置不再可见。
这是因为Button锁定了布局的底部。

layout_anchor和layout_anchor重力

<?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"
  tools:context=".MainActivity">

  <android.support.design.widget.FloatingActionButton
      android:id="@+id/fab"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:layout_margin="@dimen/fab_margin" 

  <android.support.design.widget.FloatingActionButton
      android:id="@+id/fab1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      app:layout_anchor="@id/fab"
      app:layout_anchorGravity="left|top"
      android:layout_margin="@dimen/fab_margin" 

  <android.support.design.widget.FloatingActionButton
      android:id="@+id/fab2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      app:layout_anchor="@id/fab1"
      app:layout_anchorGravity="end|top"
      android:layout_margin="@dimen/fab_margin" 

  <android.support.design.widget.FloatingActionButton
      android:id="@+id/fab3"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      app:layout_anchor="@id/fab2"
      android:layout_gravity="top"
      app:layout_anchorGravity="end|top"
      android:layout_margin="@dimen/fab_margin" 

</android.support.design.widget.CoordinatorLayout>