2019独角兽企业重金招聘Python工程师标准>>>

前言

伟大的Google为Android推出了一系列的兼容包,最新的就是Design Support Library了,这里我们结合v7和v4中的几个控件,来主要学习Design Support Library中的几个新控件!一个Demo学会用它们!

效果动图GIF:

学习内容

通过本实例可以学习到以下内容:

  • Drawerlayout和NavigationView实现优雅的Google范儿侧边栏;

  • 新控件CoordinatorLayout、AppBarLayout、Toolbar、FloatingActionButton的用法,以及Toolbar的渐变隐藏动画效果;

  • 官方Tabs组件TabLayout和ViewPager结合实现主界面内容区域;

  • SwipeRefreshLayout和RecyclerView结合实现下拉刷新,以及RecyclerView的数据适配器RecyclerView.Adapter的用法,还有RecyclerView中item的点击事件的实现方法;

  • 卡片式CardView的用法;

  • 类似Toast的新控件Snackbar的用法。

布局文件

在源码中学习Android,是有种身临其境的感觉的。

学习Android解释再多代码都没有用,因为解释过了还是不会用。因此,我们这里将布局文件XML源码贴出来供学习,放心,所有知识点都已经注释在源码中。

styles.xml源码

<resources><style name="AppTheme" parent="MyThemeBlue"></style><!-- 蓝色为主色调 --><style name="MyThemeBlue" parent="Theme.AppCompat.Light.NoActionBar"><!--选中状态icon的颜色和字体颜色--><item name="colorPrimary">@color/main_blue_light</item><item name="colorPrimaryDark">@color/main_blue_dark</item><item name="colorAccent">@color/main_blue_light</item><!--正常状态下字体颜色和icon颜色--><item name="android:textColorPrimary">@color/main_white</item></style>
</resources>

colorPrimary、colorPrimaryDark、colorAccent、textColorPrimary的含义,请看博文《Android L+ Theme 与 Toolbar 实例》。

主布局activity_my.xml源码(重点)

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/id_drawerlayout"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 第一个位置 --><!-- 你的主界面内容,必须放置在Drawerlayout中的第一个位置根据自己的需要来放置控件,例如:LinearLayout布局或者RelativeLayout布局;也可以是单个控件,如 TextView等  --><include layout="@layout/content_main" /><!-- 第二个位置 --><!-- 用来放Drawerlayout中的内容,这里使用NavigationView来实现类似Google pLay中的侧滑栏效果,必须在build.gradle中添加compile 'com.android.support:design:22.2.0';另外,如果不需要NavigationView效果,也可以放置一个普通布局文件就是一个普通的侧滑栏了。--><!--注意:如果使用NavigationView(其他控件也是一样)的特有属性,需要加上命名空间:xmlns:app="http://schemas.android.com/apk/res-auto";另外,一定要添加android:layout_gravity="left"属性。--><!--属性解析:app:headerLayout:    NavigationView中头部的head部分的布局,是自己实现的;app:menu:            指定Nav中的Menu布局,就是自己写Menu中的按钮,要放在res/menu/文件夹下;app:itemTextColor:  用来设置Nav中,menu item的颜色选择器。还有一些属性:           和itemTextColor用法一样,指定一个颜色选择器,实现不同的颜色效果。app:itemIconTint:app:itemBackground:--><android.support.design.widget.NavigationViewandroid:id="@+id/id_navigationview"android:layout_width="match_parent"android:layout_height="match_parent"app:itemTextColor="@color/selector_nav_menu_textcolor"android:layout_gravity="left" /></android.support.v4.widget.DrawerLayout>

content_main.xml源码(重点)

<?xml version="1.0" encoding="utf-8"?><!--CoordinatorLayout是这次新添加的一个增强型的FrameLayout,通过它可以实现很多东西:例如:1.界面向上滚动逐渐隐藏Toolbar;2.在其中可以放置浮动的View,就像Floating Action Button。
-->
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/id_coordinatorlayout"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"><!--AppBarLayout跟它的名字一样,把容器类的组件全部作为AppBar。将AppBarLayout放在CoordinatorLayout中,就可以实现滚动效果。本例中,TabLayout在界面滚动时,随着Toolbar的逐渐隐藏,将占据Toolbar的位置,达到节省屏幕空间,界面动画效果的目的。--><android.support.design.widget.AppBarLayoutandroid:id="@+id/id_appbarlayout"android:layout_width="match_parent"android:layout_height="wrap_content"><!--属性解析:app:theme:指定Toolbar的样式,包括ActionbarToggle和popupMenu的指示图标颜色app:popupTheme:指定popupMenu溢出后的样式app:title:    指定Toolbar中主Title的内容--><!--app:layout_scrollFlags的意思是:设置的layout_scrollFlags有如下几种选项:scroll: 所有想滚动出屏幕的view都需要设置这个flag- 没有设置这个flag的view将被固定在屏幕顶部。enterAlways: 这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。enterAlwaysCollapsed: 当你的视图已经设置minHeight属性又使用此标志时,你的视图只能以最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。exitUntilCollapsed: 当视图会在滚动时,它一直滚动到设置的minHeight时完全隐藏。需要注意的是,后面两种模式基本只有在CollapsingToolbarLayout才有用,而前面两种模式基本是需要一起使用的,也就是说,这些flag的使用场景,基本已经固定了。--><android.support.v7.widget.Toolbarandroid:id="@+id/id_toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"app:layout_scrollFlags="scroll|enterAlways"app:popupTheme="@style/ThemeOverlay.AppCompat.Light"app:theme="@style/ThemeOverlay.AppCompat.ActionBar"app:title="@string/toolbar_title" /><!--Tabs选项卡,和ViewPager搭配使用可以增大界面的内容展示量,实现各种个性化分类内容展示而不互相干扰!Google在Design support library中提供官方的Tab组件,它就是TabLayout。相比Github上面开源的第三方库,这个更加简单易用。有以下常用属性:app:tabGravity="fill"  表示TabLayout中的Tabs要占满屏幕的width;app:tabSelectedTextColor:Tab被选中字体的颜色;app:tabTextColor:Tab未被选中字体的颜色;app:tabIndicatorColor:Tab指示器下标的颜色;--><android.support.design.widget.TabLayoutandroid:id="@+id/id_tablayout"android:layout_width="match_parent"android:layout_height="wrap_content"app:tabGravity="fill"app:tabIndicatorColor="@color/main_white" /></android.support.design.widget.AppBarLayout><!--我们常用的ViewPager,不多说了。你会发现多了一个 app:layout_behavior 属性,没错,如果你使用CoordinatorLayout来实现Toolbar滚动渐变消失动画效果,那就必须在它下面的那个控件中加入这个属性,并且下面的这个控件必须是可滚动的。当设置了layout_behavior的控件滑动时,就会触发设置了layout_scrollFlags的控件发生状态的改变。--><android.support.v4.view.ViewPagerandroid:id="@+id/id_viewpager"android:layout_width="match_parent"android:layout_height="wrap_content"app:layout_behavior="@string/appbar_scrolling_view_behavior" /><!--这是一个浮动按钮。由于FloatingActionButton是重写ImageView的,所有FloatingActionButton拥有ImageView的一切属性。属性介绍:app:backgroundTint : FAB的背景色。app:elevation      :FAB的阴影效果。app:rippleColor    :设置涟漪的颜色,默认是由背景色生成的暗色调,可以自己指定。app:pressedTranslationZ  :FAB动画效果,在它被按下的时候阴影就会增大。--><android.support.design.widget.FloatingActionButtonandroid:id="@+id/id_floatingactionbutton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|end"android:src="@mipmap/ic_action_plusone"app:backgroundTint="@color/main_blue_light"app:elevation="6dp"app:pressedTranslationZ="12dp"app:rippleColor="@color/main_blue_dark" /></android.support.design.widget.CoordinatorLayout>

frag_main.xml源码(Fragment的布局)

<?xml version="1.0" encoding="utf-8"?><!--SwipeRefreshLayout是伟大的Google在v4包中给出的下拉刷新组件。-->
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/id_swiperefreshlayout"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"><!--使用RecyclerView需要在build.gradle中添加compile 'com.android.support:recyclerview-v7:22.2.0'--><android.support.v7.widget.RecyclerViewandroid:id="@+id/id_recyclerview"android:layout_width="match_parent"android:layout_height="wrap_content" /></android.support.v4.widget.SwipeRefreshLayout>

item_main.xml源码(RecyclerView中item)

<!--CardView就是一个卡片样式的FrameLayout。参数介绍:app:cardBackgroundColor  :   背景颜色app:cardCornerRadius    :   设置圆角。app:cardElevation       :    阴影。app:cardMaxElevation    :       最大阴影。app:cardPreventCornerOverlap  : 在v20和之前的版本中添加内边距,这个属性是为了防止卡片内容和边角的重叠。app:cardUseCompatPadding  :  设置内边距,v21+的版本和之前的版本仍旧具有一样的计算方式
-->
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/id_cardview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"app:cardBackgroundColor="@color/main_blue_light"app:cardCornerRadius="4dp"app:cardElevation="5dp"app:cardMaxElevation="10dp"app:cardPreventCornerOverlap="true"app:cardUseCompatPadding="true"><TextViewandroid:id="@+id/id_textview"android:layout_width="200dp"android:layout_height="200dp"android:layout_gravity="center"android:gravity="center"android:textColor="@color/main_white"android:textSize="30sp" /></android.support.v7.widget.CardView>

menu_nav.xml的源码(NavagationView中菜单)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><group android:checkableBehavior="single"><itemandroid:id="@+id/nav_menu_home"android:icon="@mipmap/ic_home_white_48dp"android:title="主页" /><itemandroid:id="@+id/nav_menu_categories"android:icon="@mipmap/ic_sort_by_alpha_white_48dp"android:title="分类" /><itemandroid:id="@+id/nav_menu_feedback"android:icon="@mipmap/ic_message_white_48dp"android:title="反馈" /><itemandroid:id="@+id/nav_menu_setting"android:icon="@mipmap/ic_settings_white_48dp"android:title="设置" /></group>
</menu>

header_nav.xml源码(NavagationView的head)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="220dp"android:background="@drawable/ic_user_background"android:gravity="center"android:orientation="vertical"><!--一个显示圆形头像的自定义ImageView--><com.sunjiajia.androidnewwidgetsdemo.view.RoundedImageViewandroid:id="@+id/id_header_face"android:layout_width="110dp"android:layout_height="110dp"android:scaleType="fitXY"android:src="@drawable/author" /><TextViewandroid:id="@+id/id_header_authorname"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/header_author_name"android:textColor="@android:color/black"android:textSize="16sp" /><TextViewandroid:id="@+id/id_header_url"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/header_author_url"android:textColor="@android:color/black"android:textSize="18sp" />
</LinearLayout>

Java代码

Java代码写法比较简单,这里只给出RecyclerView.Adapter的写法(包括item点击事件)。

RecyclerView.Adapter写法源码

package com.sunjiajia.androidnewwidgetsdemo.adapter;import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import com.sunjiajia.androidnewwidgetsdemo.R;import java.util.ArrayList;
import java.util.List;/*** Created by Monkey on 2015/6/29.*/
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewHolder> {// 点击事件接口public interface OnItemClickListener {void onItemClick(View view, int position);void onItemLongClick(View view, int position);}public OnItemClickListener mOnItemClickListener;public void setOnItemClickListener(OnItemClickListener listener) {this.mOnItemClickListener = listener;}public Context mContext;public List<String> mDatas;public LayoutInflater mLayoutInflater;public MyRecyclerViewAdapter(Context mContext) {this.mContext = mContext;mLayoutInflater = LayoutInflater.from(mContext);// 这里是模拟数据。mDatas = new ArrayList<>();for (int i = 'A'; i <= 'z'; i++) {mDatas.add((char) i + "");}}/*** 创建ViewHolder*/@Overridepublic MyRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View mView = mLayoutInflater.inflate(R.layout.item_main, parent, false);MyRecyclerViewHolder mViewHolder = new MyRecyclerViewHolder(mView);return mViewHolder;}/*** 绑定ViewHoler,给item中的控件设置数据*/@Overridepublic void onBindViewHolder(final MyRecyclerViewHolder holder, final int position) {//点击事件在这里实现,主要是利用RecyclerView中填充的布局控件可以被点击这个原理if (mOnItemClickListener != null) {holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mOnItemClickListener.onItemClick(holder.itemView, position);}});// 长点击事件holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {mOnItemClickListener.onItemLongClick(holder.itemView, position);return true;}});}holder.mTextView.setText(mDatas.get(position));}@Overridepublic int getItemCount() {return mDatas.size();}
}

MyRecyclerViewHolder.java源码

package com.sunjiajia.androidnewwidgetsdemo.adapter;import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;import com.sunjiajia.androidnewwidgetsdemo.R;/*** Created by Monkey on 2015/6/29.*/
public class MyRecyclerViewHolder extends RecyclerView.ViewHolder {public TextView mTextView;public MyRecyclerViewHolder(View itemView) {super(itemView);mTextView = (TextView) itemView.findViewById(R.id.id_textview);}
}

结语

在源码中学习Android,是有种身临其境的感觉的。

整个Demo的源码我放在了GitHub上,谢谢star一下~
在看源码过程中如果发现什么问题,请在留言,看到一定回复。

源码地址:
AndroidNewWidgetsDemo

来自: http://sunjiajia.com/2015/07/02/android-new-widgets-demo/

转载于:https://my.oschina.net/u/2502527/blog/552677

一个Demo学会用Android兼容包新控件相关推荐

  1. 视频教程-Android Material Design 新控件-Android

    Android Material Design 新控件 刘志远,北京邮电大学硕士研究生, 北京育华志远科技有限公司创始人, 育华志远教育品牌负责人,育华志远课程体系打造者. 率领团队为互联网行业培训千 ...

  2. Android 5.0新控件——FloatingActionButton(悬浮按钮)

    Android 5.0新控件--FloatingActionButton(悬浮按钮) FloatingActionButton是5.0以后的新控件,一个悬浮按钮,之所以叫做悬浮按钮,主要是因为自带阴影 ...

  3. 在Eclipse添加Android兼容包( v4、v7 appcompat )

     昨天添加Android兼容包,碰到了很多问题,在这里记录一下,让后面的路好走. 如何选择兼容包, 请参考Android Support Library Features(二) 一.下载Suppo ...

  4. 一个demo学会css

    全栈工程师开发手册 (作者:栾鹏) 一个demo学会css css选择器全解 css操作语法全解 学习了css权威指南这本书,自己喜欢边学边总结边写demo,所以写了这篇文章,包含了大部分的css编程 ...

  5. android 兼容包(可兼容低版本系统)

    android 兼容包(可兼容低版本系统) 高Level为了兼容低Level版本,从而推出了兼容包android-support-v* 目前发现的只有三个 android-support-v4   a ...

  6. 一个demo学会jquery mobile

    全栈工程师开发手册 (作者:栾鹏) jQuery Mobile事件全解 jQuery Mobile 所有class选项 jQuery Mobile 所有data-*选项 一个demo学会jquery ...

  7. 【转】Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用...

    Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用 分类: Android UI ...

  8. 一个Activity掌握Design新控件 (转)

    原文地址:http://blog.csdn.net/lavor_zl/article/details/51295364 谷歌在推出Android5.0的同时推出了全新的设计Material Desig ...

  9. android Snackbar新控件解析

    Dialog和Toast,我们在日常的开发中一定非常熟悉,常常被用来作为Android应用内提示性信息的两种展示方式.然而Google在Design包中又提供了一种新的选择,那就是Snackbar.今 ...

最新文章

  1. bind日志配置详解
  2. 开发者应具备的产品设计意识
  3. js获取网页面的高度和宽度
  4. 【Python基础】pandas中apply与map的异同
  5. Linux并发服务器编程之多线程并发服务器
  6. C 语言笔记: 链表节点实现技巧--struct的妙用
  7. c语言 静态变量 初始化,c – 静态变量初始化两次
  8. 游标、过程、函数、包
  9. oracle 由32位迁移到64位的问题
  10. android kl文件
  11. TechSmith Camtasia Mac v2021屏幕录制剪辑软件
  12. 密码学 双线性映射
  13. Java实习生的标准是什么
  14. Unity开发 解决TapTap隐私协议
  15. 【Tomcat】Tomcat 介绍及使用教程
  16. 计算机用老毛桃u盘备份系统,老毛桃u盘启动盘ghost备份系统操作步骤
  17. 秦九韶算法以及大数取余应用
  18. 小话设计模式(十三)职责链模式
  19. Android UI最佳实践
  20. 分析网站如何检测已经登录的QQ帐号

热门文章

  1. linux能挂载的文件类型,mount命令是如何自动识别挂载点的文件系统类型的
  2. 代码提交本地代码和远程代码不同步问题(笔记)
  3. sessionStorage、localStorage存储api
  4. WebStorm搭建Node开发环境
  5. 飞机大战HTML5游戏源码,基于Canvas制作的网页版飞机大战游戏+飞机大战手机端
  6. UISwitch 开关控件—IOS开发
  7. 逐帧动画与人运动动画制作
  8. 关于安装TortoiseSVN.msi 报错2203错误
  9. Nginx 简单命令
  10. 人工智能连接学派和符号学派的发展历程图