使用Kotlin的Android CoordinatorLayout
在本教程中,我们将使用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>