日志

Android CoordinatorLayout 入门介绍

 来源    2016-11-12    2  

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 surfaceview 入门介绍
日志由于工作中需自定义控件,以前没写过. 开始时,实用view 实现了,经理说不好,担心效率低,要求每秒需要刷新10次左右. 然后,学习使用  surfaceview. 看了网上简单的Demo,找到him ...
1
Android入门:Service入门介绍
日志一.Service介绍 二.Service核心代码 开始服务: 停止服务: 三.Service生命周期 1.通过Context.startService()启动服务 2.通过Context.bindS ...
android – CoordinatorLayout使用ViewPager的RecyclerView
问答我使用的视图CoordinatorLayout从android.support.design.我想附加应用程序:layout_behavior到片段的RecyclerView? 在Google给出的示 ...
android – CoordinatorLayout替换Fragments
问答我在CoordinatorLayout容器中替换Fragments时遇到问题. 我有一个带有CoordinatorLayout的课程,一个AppBarLayout和一个CollapsingToolba ...
1
android – CoordinatorLayout layout_anchor不起作用
问答我刚刚使用CoordinatorLayout尝试了新的支持设计库,但是我在锚定子视图时遇到问题.我的布局目前看起来像这样: <android.support.design.widget.Coor ...
android – CoordinatorLayout:隐藏/显示半可见工具栏?
问答Id喜欢实现与Google Play商店中可以看到的效果相似的效果,通过滚动内容,您可以在滚动时将工具栏退出屏幕. 这可以在#io15介绍的CoordinatorLayout(1)中正常工作,但是:如 ...
android – CoordinatorLayout/NestedScrollView /隐藏 – 显示工具栏/ WebView问题
问答我有一个问题: <?xml version="1.0" encoding="utf-8"?> <android.support.design. ...
Android CoordinatorLayout – Android版本之间的不一致
问答我使用Android支持设计库为我正在处理的应用程序构建配置文件视图. 该配置文件由一个标题组成,标题图片作为背景,中心是圆形图片.此外,标题的底角还有一个小视图. 标题下方是一个带有tablayou ...
android – CoordinatorLayout ActionBar片段
问答当我尝试使用CoordinatorLayout AppBarLayout放置片段时,我遇到了问题. 我尝试将不同的片段加载到我的RelativeLayout内容中,该内容位于ActionBar下面,属 ...
蜂窝Android开发入门
问答我最近购买了一个漂亮的摩托罗拉Xooms,我真的很想开发一些应用程序.我使用C#作为.NET开发人员工作,自从查看Java以来​​已经有6年了.在我的研究中,我还没有真正发现和很好的教程或学习Andr ...
android – CoordinatorLayout AppbarLayout Viewpager不调整小孩布局的大小
问答使用CoordinatorLayout与ViewPager和ViewPager结合使用时有问题: 布局没有正确调整大小.认为解决的高度包括标签高度.所以当我滚动到底部我看到这样: 主要布局代码: &l ...
android – CoordinatorLayout.Behavior回调不会触发
问答我写了一个CordinatorLayout.Behaviour类并将它分配给一个CordinatorLayout的孩子,一个LinearLayout使用 app:layout_behavior=&qu ...
java – android开发入门
问答我从一开始就是Windows开发人员,现在的趋势决定了我专注于更新的技术和平台. 我的问题是如何开始Android开发,可以在Windows 7的Windows PC上完成,如果是的话我需要什么工具. ...
android – CoordinatorLayout在AppBarLayout和RecyclerView之间增加了空间
问答CoordinatorLayout在AppBarLayout和RecyclerView之间增加了空间.不确定它是工具栏还是AppBarLayout. 手机上呈现的布局的屏幕截图: Studio上的设计 ...
Android CoordinatorLayout AppbarLayout Viewpager总是滚动
问答我有一个经典的布局,顶部有一个ToolBar,下面是一个TabLayout,一个ViewPager从TabLayout切换选项卡.当ViewPager中的内容是可滚动的时候,ToolBar应该滚出视线 ...
android – CoordinatorLayout,AppBarLayout和ToolBar – 工具栏不会滚动屏幕
问答当我向上滚动ViewPager(ViewPager位于放置在FrameLayout中的片段内)并向下滚动时显示ToolBar时,我试图让我的ToolBar滚动离开屏幕.我正在尝试使用支持设计库实现此目 ...
android – CoordinatorLayout AppBarLayout NavigationDrawer
问答当CoordinatorLayout与AppBarLayout和NavigationDrawer组合时,我有一个布局问题. 问题是,NavigationDrawer及其内容隐藏在工具栏后面.我已经做了 ...
android – CoordinatorLayout工具栏在输入时不可见,直到全高
问答我的activity_main.xml的DrawerLayout中包含一个名为content_layout.xml的CoordinatorLayout.在这个CoordinatorLayout中,我的 ...
android – CoordinatorLayout的孩子不是全屏
问答我有一个全屏显示的活动.这与我尝试过的许多布局完美配合,除非CoordinatorLayout是根ViewGroup. CoordinatorLayout本身的宽度和高度都设置为match_paren ...
Android SDK入门所需的最低包
问答我可以下载包的限制. 所以任何人都可以解释为了开始使用sdk或者只是让它工作正常而必须下载的必要组件. 我正在寻找要下载的最小组件. 当我启动SDK管理器时,它会显示一个显示各种包的列表, 非常第一个 ...