Android Material Design(一)史上最全的材料设计控件大全
主要内容:
本文将要介绍Material design和Support library控件,主要包括TextInputLayout、SwitchCompat、SnackBar、FloatingActionButton、Shadows、Ripples、TabLayout、RecyclerView、Card、NavigationView、BottomSheet、Palette控件。转载请注明出处,谢谢!!
http://blog.csdn.net/johnny901114/article/details/51918436
先来看下效果吧。
1. TextInputLayout:
TextInputLayout是用来增强EditText的,使用的时候也是在EditText包裹一层布局,如:
<android.support.design.widget.TextInputLayout
android:id="@+id/til_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="UserName"/>
</android.support.design.widget.TextInputLayout>
1>主要功能特色:
①当里面的EditText获取焦点后,EditText的hint文字,会移动到EditText的上面做Label,提示用户。从上面的gif图就看出了,我就不赘述了。
②具有错误提示机制,当用户输入的内容不符合要求时,可以提示用户,以前我们都是用toast的方式,体验很差。在布局中设置app:errorEnabled=”true” 在代码中调用textInputLayout.setError(tip)方法,就可以在EditText的下方显示错误内容。
③具有字数统计功能,很多情况下输入文字都有文字字数限制,比如输入反馈、描述等。以前我们都是自己去实现,现在好了,有系统控件帮我们实现了。通过下面的配置启用该功能
app:counterEnabled="true"
app:counterMaxLength="50"
app:errorEnabled="true"
2> 具体的使用详解
由于篇幅的原因,下面的讲解,我就不每个属性值都去改下,然后贴出图片,这样也没有任何必要,希望需要的同学,自己去试试。代码会在后面有github链接。
纸上得来终觉浅,绝知此事要躬行
①如何更改EditText的下方的横线的颜色。如下图所示:
这个颜色的控制是在样式文件里设置的,通过
<item name="colorAccent">@color/colorAccent</item>
② 如何更改获取焦点后,上面Label的颜色/大小等。如下图所示:
这个颜色大小等属性修改通过
app:hintTextAppearance="@style/HintAppearance"
本工程里的样式是这样的:
<style name="HintAppearance" parent="TextAppearance.AppCompat">
<item name="android:textSize">14sp</item>
<item name="android:textColor">#8bc34a</item>
</style>
③如何修改错误提示的颜色,如下图所示:
错误的样式通过如下方式修改:
app:errorTextAppearance="@style/ErrorAppearance"
<style name="ErrorAppearance" parent="TextAppearance.AppCompat">
<item name="android:textSize">14sp</item>
<item name="android:textColor">#a2ced1</item>
</style>
需要注意的是,该属性不止改变的是错误文字的颜色、大小,还修改了EditText的的那条横线的颜色。
如果不想在编写TextInputLayout布局的时候都去设置,还可以通过style文件去统一设置,如:
<item name="textColorError">@color/textColorError</item>
当然,如果你设置了errorTextAppearance同时又设置了textColorError,TextInputLayout会优先使用errorTextAppearance配置的颜色。
④ 字数统计功能,修改错误的有颜色和上面是一样。如何修改统计字数
的样式。如下图:
这里分两种情况,一种是没有超过的情况,另一种是超过字数的情况。
//没有超过最大字数
app:counterTextAppearance="@style/CounterAppearance"
//超过最大字数
app:counterOverflowTextAppearance="@style/CounterOverflowAppearance"
使用TextInputLayout遇到的一些坑:
① 如果加上字数统计需要在style里加上textErrorColor,否则超过字数会后会闪退。
② 如果不需要字数统计,且启用错误机制(setErrorEnabled(true)), 不需要加上textErrorColor(不会闪退)系统会提供一个默认的error color。
当然可以通过textErrorColor来自定义错误颜色(error color).
可以使用更为强大的errorTextAppearance来定义错误颜色,字体大小等属性。如果TextInputLayout 同时 设置了textErrorColor和errorTextAppearance ,只有errorTextAppearance生效.
③ 如果加上字数统计,且同时设置了textErrorColor和errorTextAppearance。
这个时候回出现奇怪的效果,Label
和统计
的颜色为textErrorColor的颜色。
EditText的横线
和 错误文字提示
为errorTextAppearance设置的效果。所以为什么不加上textErrorColor会闪退,因为超过字数后TextInputLayout需要textErrorColor属性设置的颜色。
2 SwitchCompat
效果图我就不上了,文章开头就已经有了。 这个控件使用也非常简单。下面就说一下其他相关用法:
//SwitchCompat被竖线隔开
switchCompat.setSplitTrack(false);
//SwitchCompat右边会出现错误提示
switchCompat.setError("error");
//是否显示文字[默认为 开启/关闭](当然也可以自定义文字)
switchCompat.setShowText(true);
//自定义文字
switchCompat.setTextOff("Off");
switchCompat.setTextOn("On");
//设置左边文字和右边按钮的距离
switchCompat.setSwitchPadding(20);
//设置关闭和开启
switchCompat.setChecked(true/false);
//监听switchCompat开启和关闭变化
switchCompat.setOnCheckedChangeListener();
//设置Track图标
switchCompat.setTrackResource(R.mipmap.ic_back_gray);
//switchCompat设置指示图标[但是开启和关闭都是一个图标,可以在setOnCheckedChangeListener里动态设置]
switchCompat.setThumbResource(R.mipmap.ic_back_gray);
希望有需要的同学,把github上面的工程下载下来,然后打开这些方法,运行看看效果。在这里我就不贴图了。
3. SnackBar、FloatingActionButton、Shadows、Ripples
因为这些都比较简单,我就放在一起说了。
1> SnackBar 使用方法很简单[和Toast差不多],如下所示:
//带按钮的
Snackbar.make(container, "Snackbar with action", Snackbar.LENGTH_SHORT)
.setAction("Action", new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(v.getContext(), "Snackbar Action pressed",Toast.LENGTH_SHORT).show();
}
}).show();
//纯文本的
Snackbar.make(container, "This is Snackbar", Snackbar.LENGTH_SHORT).show();
2> FloatingActionButton
使用方法:
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:clickable="true"
android:src="@null"
app:backgroundTint="#0091eb"
app:fabSize="normal"/>
通过android:src修改图片
通过app:backgroundTint修改背景颜色
通过app:fabSize设置大小,只有两个选项normal和mini
3> Shadows
在布局中设置阴影
android:elevation="2dp"
app:elevation="2dp" //如果在Toolbar等控件,一定要加上这句,否则设置无效
4> Ripple效果
在res目录下新建drawable-v21. 然后建一个资源文件 如下所示:
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#dcdcdc"> //android:color 按下去的效果
<item> //默认效果
<shape>
<solid android:color="#0091eb" />
<corners android:radius="2dp" />
</shape>
</item>
</ripple>
需要注意的是,需要在drawable目录下新建同样名称的资源文件,否则在低版本上运行去闪退,因为找不到该文件,drawable-v21只在android5.0或以上系统有效。
4 Toolbar+TabLayout+RecyclerView+Card
1> Toolbar的使用
在布局中:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
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="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:title="@string/app_name"/>
在Java代码中设置Toolbar相关属性
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
if (toolbar != null) {
toolbar.setNavigationIcon(R.mipmap.ic_back_white);//设置返回按钮的icon
if (title != null) {
toolbar.setTitle(title);//设置title
}
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() { //返回按钮的点击事件
@Override
public void onClick(View v) {
finish();
}
});
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);//显示返回按钮
}
如何设置Toolbar按钮
首先在menu文件夹下新建菜单文件人,如:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/fixed"
android:title="Fixed"/>
<item
android:id="@+id/scroll"
android:title="Scrollable"/>
</menu>
//设置菜单
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.tab_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
//处理菜单的点击事件
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.fixed:
tabLayout.setTabMode(TabLayout.MODE_FIXED);
break;
case R.id.scroll:
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
break;
}
return super.onOptionsItemSelected(menuItem);
}
如果是在fragment使用menu,需要在onCreate方法里调用 setHasOptionsMenu(true);
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
2> TabLayout
TabLayout属于design支持包下,所以需要在gradle加载相关配置:
compile 'com.android.support:design:23.4.0'
TabLayout一般和ViewPager一起结合使用:
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
style="@style/TabLayoutStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
app:tabContentStart="50dp"
app:tabMode="scrollable"/>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
使用其实非常简单,关键就一个方法:
tabLayout.setupWithViewPager(viewPager);
完整代码如下所示:
viewPager.setAdapter(new ViewPagerAdapter(
Arrays.asList("Tab1", "Tab2", "Tab3", "Tab4", "Tab5", "Tab6"),
Arrays.asList(new RecyclerViewFragment(), new RecyclerViewFragment(),
new RecyclerViewFragment(), new RecyclerViewFragment(),
new RecyclerViewFragment(), new RecyclerViewFragment()
)));
tabLayout.setupWithViewPager(viewPager);
TabLayout还可以设置滚动和屏幕填充。
通过以下两个方法设置即可:
tabLayout.setTabMode(TabLayout.MODE_FIXED);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
效果图我就不贴出来了。
在TabLayout.MODE_SCROLLABLE模式下还可以设置左边的padding:
app:tabContentStart=”50dp”
下面是Adapter
代码
class ViewPagerAdapter extends FragmentStatePagerAdapter {
private List<String> list;
private List<? extends Fragment> fs;
public ViewPagerAdapter(List<String> list, List<? extends Fragment> fs) {
super(getChildFragmentManager());
this.list = list;
this.fs = fs;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Fragment getItem(int position) {
return fs.get(position);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
@Override
public CharSequence getPageTitle(int position) {
return list.get(position);
}
}
3> RecyclerView
RecyclerView 是ListView的替代者,使用方法也相似,只不过方法名都替我们规范好了。
RecyclerView功能方面比ListView更加强大。比如动画、横向滚动、瀑布流等。
从使用角度上讲,RecyclerView不仅要设置adapter,还要设置layoutManager,layoutManager也就是相对于listView强大的地方。
系统内置的LayoutManager有:
LinearLayoutManager
、GridLayoutManager
、StaggeredGridLayoutManager
下面具体说下用法:
recyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(recyclerView.getContext());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(new RecyclerAdapter(list));
下面是 adapter
public class RecyclerAdapter extends RecyclerView.Adapter {
private List<String> list;
public RecyclerAdapter(List<String> list) {
this.list = list;
}
//创建Holder和ListView中一样。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ItemViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_card_view, parent, false));
}
//绑定数据
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
itemViewHolder.tvTitle.setText(list.get(position));
itemViewHolder.tvDesc.setText(list.get(position) + " this is description");
}
@Override
public int getItemCount() {
return list.size();
}
static class ItemViewHolder extends RecyclerView.ViewHolder {
TextView tvTitle, tvDesc;
public ItemViewHolder(View itemView) {
super(itemView);
tvTitle = (TextView) itemView.findViewById(R.id.tv_vibrant);
tvDesc = (TextView) itemView.findViewById(R.id.title_desc);
}
}
}
需要说明的地方已经注释了,就不赘述了!
4> CardView
CardView属于V7包下,所以需要加入如下配置:
compile 'com.android.support:cardview-v7:23.4.0'
CardView使用非常简单,配置下就可以了:
<android.support.v7.widget.CardView
android:id="@+id/card_view"
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="wrap_content"
android:background="#ffffff"
app:cardCornerRadius="2dp"
app:cardElevation="3dp"/>
两个重要的属性:
app:cardCornerRadius=”2dp” 设置圆角
app:cardElevation=”3dp” 设置阴影
5 NavigationView
NavigationView主要是结合DrawerLayout来使用的。
下来看下布局:
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
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"
android:fitsSystemWindows="true">
<include layout="@layout/navigation_container_view"/>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/app_header"
app:insetForeground="@color/colorPrimaryDark"
app:menu="@menu/navigation_menu"/>
</android.support.v4.widget.DrawerLayout>
从上面的布局可以看出NavigationView 分两部分,一个是header,一个是menu。
① 如何修改icon和text的颜色
从文章开头的GIF可以看到,背景是蓝色的,menu的按钮和文字是黑色的,怎么修改呢?
可以通过如下配置修改:
app:itemIconTint="#2196f3" 给icon着色
app:itemTextColor="#009688" menu文字颜色
app:itemBackground="@drawable/my_ripple" 设置menu item的背景
效果如下:
②如何修改 Toolbar 左边汉堡图标
的颜色
通过开头的那个GIF图可以看到 ,Toolbar左边的icon是黑色的,这个icon网上也叫 hamburger icon
,形似汉堡,所以网上很多人叫做hamburger icon。
通过一个样式就可以修改了:
<style name="DrawerArrowStyle" parent="@style/Widget.AppCompat.DrawerArrowToggle">
<item name="spinBars">true</item>
<item name="color">@android:color/white</item> //custom color
</style>
//然后在style中加上就可以了
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
下面是完整的menu布局:
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_search1"
android:checked="true"
android:icon="@mipmap/ic_search_black"
android:title="Search1"/>
<item
android:id="@+id/nav_search2"
android:checked="true"
android:icon="@mipmap/ic_search_black"
android:title="Search2"/>
<item
android:id="@+id/nav_search3"
android:icon="@mipmap/ic_search_black"
android:title="Search3"
app:actionLayout="@layout/menu_action_layout"/>
<item
android:id="@+id/nav_search4"
android:icon="@mipmap/ic_search_black"
android:title="Search4"/>
<item
android:id="@+id/nav_search5"
android:icon="@mipmap/ic_search_black"
android:title="Search5"
android:visible="false"/>
</group>
<item
android:id="@+id/navigation_subheader"
android:title="SubHeader">
<menu>
<item
android:id="@+id/nav_search6"
android:checked="true"
android:icon="@mipmap/ic_search_black"
android:title="Search6"/>
<item
android:id="@+id/nav_search7"
android:checked="true"
android:icon="@mipmap/ic_search_black"
android:title="Search7"/>
</menu>
</item>
<group android:id="@+id/aligned_items">
<item
android:id="@+id/nav_search8"
android:icon="@mipmap/ic_search_black"
android:title="Search8"/>
<item
android:id="@+id/nav_search9"
android:icon="@mipmap/ic_search_black"
android:title="Search9"/>
</group>
</menu>
效果如下:
③ 修改menu里的 SubHeader 颜色
从上面的图我们发现SubHeader是黑色的,怎么修改颜色, 加上下面的配置即可:
<item name="android:textColorSecondary">#ffffff</item>
BottomSheet
BottomSheet 其实就是个Behavior,并且这个Behavior内置的,无需自己定义,使用非常简单,只需要在布局的时候配置behavior即可,从这里可以看出,behavior的强大了吧,后面有时间研究下自定behavior,然后再来和大家一起讨论、分享。
Palette
Palette 中文意思问,调色器。就是你给它一张图片,通过palette可以获取各种颜色。
其实Google官方已经给出了,很好的例子,在google demo里面做出了非常详解的使用示例,我这里只做抛砖引玉的作用,需要的同学可以去github上去下载google demo。我这里给下google的效果图:
Android Material Design(一)史上最全的材料设计控件大全的更多相关文章
- 史上最全的微信小程序代码大全
--------------------- 本文来自 fenxiangjun 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/fenxiangjun/article/d ...
- GitHub上史上最全的Android开源项目分类汇总 (转)
GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...
- 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发
[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文 http: ...
- 史上最全的Android开发学习教程集锦【初学者】
根据Google的报告,截止2017年5月为止,Android活跃用户已超过20亿,并还在持续增长中.Android系统在几个主要的市场上已超过了iOS系统,特别是在美国,欧洲和日本,然而苹果确实在中 ...
- markdown写ppt (史上最全)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 史上最全Windows版本搭建安装React Native环境配置
史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...
- Android Material Design 兼容库的使用
Android Material Design 兼容库的使用 mecury 前言:近来学习了Android Material Design 兼容库,为了把这个弄懂,才有了这篇博客,这里先推荐两篇博客: ...
- Android Material Design Ripple Effect在Android5.0(SDK=21)以下Android版本崩溃问题解决
Android Material Design Ripple Effect在Android5.0(SDK=21)以下Android版本崩溃问题解决 附录1的Android Ripple Effect水 ...
- Android Material Design的FloatingActionButton,Snackbar和CoordinatorLayout
如果是为了兼容低版本的Android系统,则需要引用Android Material Design的扩展支持库,我在之前的一篇文章张,较为详细的说明了如何导入Android Material Desi ...
随机推荐
- java 反射(Reflection)
看了很多关于java 反射的文章,自己把所看到的总结一下.对自己,对他人或多或少有帮助吧. Java Reflection是什么? 首先来看看官方文档Oracle里面对Reflection的描述: R ...
- [HNOI 2011]卡农
Description 题库链接 在集合 \(S=\{1,2,...,n\}\) 中选出 \(m\) 个子集,满足三点性质: 所有选出的 \(m\) 个子集都不能为空. 所有选出的 \(m\) 个子集 ...
- [FJOI 2014]最短路径树问题
Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最 ...
- [BZOJ]4755: [Jsoi2016]扭动的回文串
Time Limit: 10 Sec Memory Limit: 512 MB Description JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i ...
- POJ - 3264:Balanced Lineup
ST表模版 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring&g ...
- 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树
原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...
- 基于Spark环境对比Python和Scala语言利弊
在数据挖掘中,Python和Scala语言都是极受欢迎的,本文总结两种语言在Spark环境各自特点. 本文翻译自 https://www.dezyre.com/article/Scala-vs-Py ...
- DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)
前一篇文章我们介绍了如何将创建产品的领域逻辑与产品的持久化仓储通过上架产品的用例组织起来,完成了一个功能.在实际的项目中,多种前端的形态比如PC Web. 微信小程序.原生APP等要调用后端的功能,通 ...
- React Native 系列(三) -- 项目结构介绍
前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...
- 3.3 声明[[],]的数组, push_back() 和 back() 的区别
声明一个 [[],] 的二维数组: vector < vector<int> > res(1, vector<int>()); 或者 vector<vecto ...