Android CoordinatorLayout 入门介绍
Android CoordinatorLayout 入门介绍
在 2015
年的 I/O
开发者大会上,Google
介绍了一个新的 Android Design Support Library
,该库可以帮助开发者在应用上使用 meterial design
。它包含了许多重要的 meterial design
的构建块,并且它支持 API 7
及以上的版本。如果你错过了这次大会,那就请打开谷歌开发者站点来查阅它的相关信息吧:传送门。
CoordinatorLayout
在库中所有好的东东之间,看起来真正有趣的是 CoordinatorLayout
,它是一个 FrameLayout
。从它的名字中,你或许已经猜到:该布局的强大在于,能够协调子元素之间的依赖关系。
你需要做的就是把 View
包含在 CoordinatorLayout
中。让我们直接进入代码吧。下面的例子非常简单,它包含了 Floating Action Button
,点击时会触发一个 Snackbar
。
首先,在 gradle
文件中引入 meterial design
库:
compile 'com.android.support:design:22.2.0'
接下来,为 Activity
创建一个简单的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/ic_done" /> </android.support.design.widget.CoordinatorLayout>
还需要添加 MainActivity
:
public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Hello Snackbar", Snackbar.LENGTH_LONG).show();
}
});
}
}

非常酷,是吗?
但是,如果你想使用其它 FAB
的实现又会怎么样呢?因为 Support Library
中的 FAB
实现没有菜单选项,于是,我们尝试一下由开发者 Base
实现的 FAB
开源库。
compile 'com.getbase:floatingactionbutton:1.9.1'
<?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.getbase.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
app:fab_icon="@drawable/ic_done" /> </android.support.design.widget.CoordinatorLayout>

如图所示,在这种情况下,CoordinatorLayout
不能正常工作。这是因为 View
没有默认的CoordinatorLayout.Behavior
的实现。现有的解决方案就是等待有人来完善它。
或者呢,我们可以为这个组件写一个自定义的行为实现。:D
View 知道如何表现
这个框架真的非常强大,要给 view
自定义行为时,你根本不需要获取这个 view
。你还可以改变任意 view
的默认行为。
首先,需要继承 Behavior
类:
public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<FloatingActionButton>
为了使这个类可以填充 xml
中的内容,我们需要给它设置一个构造方法,方法有两个参数:Context
和AttributeSet
。
public FloatingActionButtonBehavior(Context context, AttributeSet attrs) {}
接下来的步骤是重写 layoutDependsOn()
方法,并且,如果我们想监听改变,就让方法返回 true
。在例子中,我们只想监听 Snackbar
对象的改变。
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
return dependency instanceof SnackbarLayout;
}
现在,让我们继承真正行为的实现。当 CoordinatorLayout
中的 view
每次发生变化时,onDependentViewChanged
方法都会被调用。在这个方法中,我们要读取当前 Snackbar
的状态。当Snackbar
显示的时候,我们想把 FAB
也移上来。要实现这样的目的,我们需要把 FAB
的 Y
坐标设置为Snackbar
的高度。要得到正确的转换值,我们需要从转化的 Y
值中减去 Snackbar
的高度。
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
child.setTranslationY(translationY);
return true;
}
最后一步就是告诉 CoordinatorLayout
使用 FloatingActionButtonBeahvior
:
<?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.getbase.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
app:layout_behavior="com.getbase.coordinatorlayoutdemo.FloatingActionButtonBehavior"
app:fab_icon="@drawable/ic_done" /> </android.support.design.widget.CoordinatorLayout>
最终,问题被修正了:

如果你想为 view
定义默认行为,只需要在你的 Behavior
类上添加 DefaultBehavior
注解就可以了。
以上代码的 GitHub
地址为:https://github.com/ggajews/coordinatorlayoutwithfabdemo 。
祝大家编码愉快!
Android CoordinatorLayout 入门介绍的更多相关文章
- [原]Android Fragment 入门介绍
Fragment Fragment 产生,优点,用途,使用方法简介 1 Fragmeng简介 自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片.片段.其上的是为 ...
- android surfaceview 入门介绍
由于工作中需自定义控件,以前没写过. 开始时,实用view 实现了,经理说不好,担心效率低,要求每秒需要刷新10次左右. 然后,学习使用 surfaceview. 看了网上简单的Demo,找到him ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...
- [译]:Xamarin.Android开发入门——Hello,Android深入理解
返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
- Hello, Android 快速入门
Hello, Android Android 开发与 Xamarin 简介 在这两节指南中,我们将 (使用 Xamarin Studio或 Visual Studio)建立我们的第一个 Xamarin ...
- Android编译系统入门(二)
Android.mk的使用方法 在上一篇Android编译系统入门(一)中我们只要介绍了Android系统使用make命令默认编译的依赖树是droid,而droid是一个伪目标,它有两个先决条件dro ...
- Android开发入门要点记录:四大组件
cocos2dx跨平台开发中需要了解android开发,昨天快速的浏览了一本Android开发入门教程,因为之前也似懂非懂的写过Activity,Intent,XML文件,还有里面许多控件甚至编程思想 ...
- 《Delphi XE6 android 编程入门教程》推荐
近5.6年已经没有看见关于delphi的新技术的书出来了(看来在国内delphi的使用量确实很低了), 高勇同学最近出了一本<Delphi XE6 android 编程入门教程>,上周刚拿 ...
随机推荐
- 教你u盘中毒后如何恢复被隐藏文件
方法1: 1)在桌面空白处单击鼠标右键,新建一个文本文档,如下图所示: 2) 然后将下列一段代码拷贝到文档中: for /f "delims=?" %%a in ('dir /a ...
- 流畅的python第二章序列构成的数组学习记录
python内置序列类型概览 列表推导和生成器表达式 列表推导是构建列表的快捷方式,而生成器表达式可以用来创建其他任何类型的序列 列表推导的示例 >>>test = [i*2 for ...
- hdr rt format对颜色的影响
我刚刚终于理解为什么rendertarget的format对颜色的影响为什么那么大了 r8g8b8a8 这种会有band artifacts rgbafloat 这种浮点rt 的色带变化更为连贯(R ...
- JavaScript 中的不可变对象(Immutable Objects)
默认情况下,JavaScript 中的对象是可变的.我们可以更改原始值(字符串,数字等)和对象.我们来看看这个对象: let obj = { num: , obj: { content: " ...
- socket网络编程基础小记
"一切皆Socket!" 话虽些许夸张.可是事实也是,如今的网络编程差点儿都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间怎样通 ...
- 解决:mysql5.7 timestamp默认值‘0000-00-00 00:00:00’报错
mysql5.7 运行sql脚本时报错 - Invalid default value for 'UPDATE_TIME' [Err] CREATE TABLE `V_TBL_AMOUNT_REASO ...
- Git原始笔记
.dir .mkdir lxit .cd lxit .git init(git仓库不要动!!! 除非用命令动它里面的文件,新添加的可以动) .ls .pwd Config: git config -- ...
- STL源码剖析(适配器)
STL中由三类适配器,它们分别是: 1.容器适配器(stack.queue) 2.迭代器适配器(insert_iterator.reverse_iterator.iostream_iterator) ...
- STL源码剖析(算法)
STL中算法是基于迭代器来实现的. 有了容器中迭代器的实现(对operator*.operator++等的重载),STL中大部分算法实现就显得很简单了. 先看一例关于find算法的实现: templa ...
- android源代码分析 android toast使用具体解释 toast自己定义
在安卓开发过程中.toast使我们常常使用的一个类.当我们须要向用户传达一些信息,可是不须要和用户交互时,该方式就是一种十分恰当的途径. 我们习惯了这样使用toast:Toast.makeText(C ...