Fragment为载体可自己主动布局的CardView(GitHub上写开源项目初体验)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持!
开篇废话:
前些天一直在看Android5.0 的Material Desgin,里面新增了一个新的控件——CardView。
从Google这次直接提供了CardView控件就能够看出它已经变的很流行了。
在此之前我们能够通过设置圆角边框来模拟CardView效果,但如今既然Google已经提供了新控件就没有理由不用它了。
而我之前在学自己定义布局的时候写了一个CardView自己主动布局的小Demo——ANDROID自己定义视图——仿瀑布布局(附源代码)
刚好近期正好在学Git。并且也想试试CardView在5.0曾经版本号的使用效果,所以将它略微改造了下写成一个Library形式的Demo放在Github上。在介绍之前先来看下演示效果:

简单介绍:
刚才已经说过本文的Demo是从之前文章里的Demo改造过来的,所以须要具体了解的话推荐先阅读之前那篇文章。
以下简介一下这个Demo的功能:
1.使用了Google在Android5.0提供的新控件CardView:
我在之前介绍Android 5.0 Material Desgin的文章中介绍过怎样在5.0里使用CardView,这个样例则介绍怎样在5.0之下使用它。
2.以Fragment为载体显示CardView:
对照上个demo,本例的CardView里面装载的不是一个简单视图。而是一个Fragment,所以我们能够把一系列的逻辑放在一个CardView之内。
3.能够动态的设置屏幕上显示的CardView数量:
在非常多的app中大家都习惯使用viewpager来左右滑动视图切换fragment去显示不同的内容。但随着屏幕越来越大和平板等因素一个屏幕显示多个Fragment会更加直观而且能更加合理的利用空间。
比方演示中竖屏和横屏中屏幕上每行显示的CardView数目不同。
4.能够动态的添加和删除CardView
对照上个demo,不仅使用Fragment作为CardView的载体,而且能够动态的删除和加入CardView(加入功能还没时间写,但接口已经写好了)。
5.以Library形式放在GitHub上开源
仿照GitHub上的开源项目,我将这个Demo做成以Library形式放在GitHub上开源,假设大家有须要能够将自己定义的fragment(须要继承自library包中CardFragment)增加到以library包中的CardManger中,并使用library包中的CardScrollView作为布局就可以实现上面效果(稍后具体解释)
不足:
1.项目中的注解还没加。。
。习惯不好应该是边写边加。。
。
2.删除时CardView中的子view的触摸事件有些问题。会慢慢改进。。。
3.转屏幕或者退出重进时没做恢复和记录处理。
。
。
4.还有太多不足的地方,大家就看看就好了,假设大家有改进意见能够留言。假设能直接在Github上提pull request更好了。。
。
使用:
1.将项目clone下来或直接下载解压:
GitHub地址为:https://github.com/a396901990/CardView_AutoLayout
2.导入eclipse中文件夹结构例如以下所看到的:
autolayoutLib就是我封装好的library文件
cardviewLib是Google在Android 5.0中support-7中的cardview jar包。
MainActivity是演示程序
他们的关系是cardviewLib是autolayoutLib的library,autolayoutLib是MainActivity的library
3.使用:
这里简介下MainActivity里是怎样使用封装好的autolayoutLib:
1.首先要使自己定义的Fragment继承autolayoutLib中的CardFragment,并有些必需要调用的方法:
// 首先必须继承library包中CardFragment类
public class IDFragment
extends CardFragment
{
ImageView arrow; LinearLayout expandedView; boolean isShow = false; @Override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState )
{
return super.onCreateView(inflater, container, savedInstanceState);
} @SuppressLint("InflateParams")
@Override
public void onActivityCreated( Bundle savedInstanceState )
{
// 须要为该fragment的rootview设置触摸监听。详细实现看library包中CardFragment类
getView().setOnTouchListener(this); super.onActivityCreated(savedInstanceState);
// 须要调用CardFragment中的setCardView()方法去设置fragment的视图
setCardView(getActivity().getLayoutInflater().inflate(R.layout.id_card, null, false)); // 假设须要设置标题则须要调用CardFragment中的setTitle()方法
setTitle("RESUME");
arrow = (ImageView) getView().findViewById(R.id.arrow);
expandedView = (LinearLayout) getView().findViewById(R.id.expandedView); arrow.setOnClickListener(new View.OnClickListener()
{ @Override
public void onClick( View arg0 )
{
expandedView.setVisibility(isShow ? View.VISIBLE : View.GONE);
arrow.setImageDrawable(isShow ? getResources().getDrawable(android.R.drawable.arrow_up_float) : getResources().getDrawable(android.R.drawable.arrow_down_float));
isShow = !isShow;
}
});
} }
主要就是以上四个注解中的内容必需要实现,剩余的就正常写fragment
2.在Activity中加入自己定义的CardFragment到CardManager中:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initCrads();
setContentView(R.layout.main_layout);
}
// 将须要显示的Fragment存放在CardManager类中,接收的类型是一个CardFragment类型的List(必须在setContentView之前调用)
public void initCrads()
{
List<CardFragment> mCardFragments = new ArrayList<CardFragment>();
mCardFragments.add(new IDFragment());
mCardFragments.add(new CalcFragment());
mCardFragments.add(new PicFragment());
mCardFragments.add(new ClockFragment());
CardManager.getInstance().setCardFragments(mCardFragments);
}
}
3.Activity中的布局文件要使用CardScrollView:
<?xml version="1.0" encoding="utf-8"? >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:auto="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <com.dean.autolayout.CardScrollView
android:id="@+id/myScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dip"
auto:columns="1" >
</com.dean.autolayout.CardScrollView> </LinearLayout>
怎样使用已经介绍完成,以下来简介一下autolayoutLib:
autolayoutLib:
全部逻辑都封装在这个library中,大家能够依据上面介绍的autolayoutLib使用步骤来作为切入口来了解它。
简单回顾下上面使用autolayoutLib的三步骤:
1.首先要使自己定义的Fragment继承autolayoutLib中的CardFragment
2.在Activity中加入自己定义的CardFragment到CardManager中
3.Activity中的布局文件要使用CardScrollView
所以能够看出autolayoutLib中无非就是这3个类。
以下来看下它的文件夹结构:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTM5NjkwMTk5MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="500" alt="">
主要须要看的我已经用红线框起来了,以下来简介一下它们的作用:
CardFragmentAdapter:
继承自FragmentPagerAdapter。作用就是CardFragment的适配器。
CardScrollView:
继承自ScrollView。在这个layout中存放了全部须要显示的视图,CardFragment的加入删除和适配器的操作都在当中。
CardManager:
一个存放全部CardFragment的model类,我将其定义为单例模式这样能够在全局保存一份就能够了
AutoCardLayout:
通过这个自己定义的laiyout能够实现依据设置的列值来显示每行的CardView数量,别且会依照类似于瀑布布局的方式来显示他们。具体能够看之前的文章有具体讲这个类。
CardFragment:
自己定义Fragment的基类,继承自Fragment。封装了一些处理CardFragment的方法。
cardview_container.xml:
CardView的布局类。能够在这里设置CardView的圆角大小和背景等等。
结束:
首先原谅我没有具体的介绍autolayoutLib。主要原因就是我实在没时间了,写到这时已经凌晨3点了。
近期实在是太忙了,開始系统的学习Git,还有装逼神器vim,并且脑子里还有几个Demo准备实现。最关键的是立即魔兽6.0要开了。基友已经开催了。
。。
假设大家对这个demo有兴趣的话能够下载下来看看,但想直接把这个lib用在项目里是不可能的,详细原因我在上面简单介绍的时候提过了。主要也是我太懒了,没时间去完好它,毕竟写它的目的主要是为了练习使用git。
过些日子等不忙时可能会继续沿着它扩展一些新的功能。
为防止有人懒得看文章,我这里再把GitHub的地址写一下:
Fragment为载体可自己主动布局的CardView(GitHub上写开源项目初体验)的更多相关文章
- UITableViewHeaderFooterView的使用+自己主动布局
UITableViewHeaderFooterView的使用+自己主动布局 使用UITableView的header或footer复用时,假设採用自己主动布局,你会发现有约束冲突,以下这样写能够消除约 ...
- IOS不用AutoLayout也能实现自己主动布局的类(3)----MyRelativeLayout横空出世
对于IOS开发人员来说,在自己主动布局出现前仅仅能通过计算和设置frame的值来处理.这样设置位置时就会出现非常多硬编码,同一时候在屏幕旋转和不同屏幕之间适配时须要编码又一次调整位置和尺寸,我们也能够 ...
- iOS_ScrollView的自己主动布局
ScrollView的自己主动布局稍显麻烦.但也是有规律可循, 下面就是仅竖向滑动的scrollView加入约束的固定做法 1.在控制器的view加入一个label.取名做anchor 2.给anch ...
- 他们主动布局(autolayout)环境的图像编辑器
hi,all: 在经过了一番犹豫之后.我决定将我自己做的这个小APP的源代码发布给大家: 其出发点是和大家一起学习iOS开发.仅供学习參考之用. 之前代码是托管与gitlab 上的,今天我将其pull ...
- iOS 自己主动布局教程
springs和struts的问题 你肯定非常熟悉autosizing masks-也被觉得是springs&struts模式.autosizing mask决定了当一个视图的父视图大小改变时 ...
- IOS自己主动布局中的浮动布局(6)----MyFloatLayout横空出世
https://github.com/youngsoft/MyLinearLayout 前言 在MyLayout的6大布局中,每种布局都有不同的应用场景. 且每种布局的子视图的约束机制不一样:线性布局 ...
- CSS3 网格布局(grid layout)基础知识 - 隐式网格自己主动布局(grid-auto-rows/grid-auto-columns/grid-auto-flow)
网格模板(grid-template)属性及其普通写法(longhands)定义了一个固定数量的轨道.构成显式网格. 当网格项目定位在这些界限之外.网格容器通过添加隐式网格线生成隐式网格轨道. 这些隐 ...
- 开源项目AndroidUtil-采用Fragment实现TabHost
原文出自:方杰|http://fangjie.info/?p=141 转载请注明出处 学习Android也有一段时间了,感觉大部分的Android应用都有很多类似的组件,所以就打算做了这样一个开源项目 ...
- 开源项目AndroidUtil-採用Fragment实现TabHost
原文出自:方杰|http://fangjie.sinaapp.com/?p=141 转载请注明出处 学习Android也有一段时间了.感觉大部分的Android应用都有非常多类似的组件,所以就打算做了 ...
随机推荐
- deep-in-es6(一)
一 迭代器和for-of循环 以前的一些遍历数组: function c(n) { console.log(n); } 方法一: for(let i = 0;i < arr.length;i++ ...
- 解决Firefox不信任StartSSL证书问题
从2016年的11月份开始,firefox \ chrome \ apple 等陆续不再信任 StartSSL 的证书,导致一些使用 StartSSL 的证书的网站访问遇到了麻烦, firefo ...
- HDU 4010 Query on The Trees (动态树)(Link-Cut-Tree)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4010 题意; 先给你一棵树,有 \(4\) 种操作: 1.如果 \(x\) 和 \(y\) 不在同一 ...
- 1、Task类构造函数
Task类的构造函数接收一个无参无返回值的委托: 1: Task task = new Task(TaskMethod); 2: task.Start();例子: task = new Task(( ...
- TypeScript深入学习
基础类型booleannumberstringstring[]//Array<string> 数组类型(ReadonlyArray<string>数组不能修改,也不允许被赋值给 ...
- 洛谷 P1927 防护伞
P1927 防护伞 题目描述 据说 2012 的灾难和太阳黑子的爆发有关.于是地球防卫小队决定制造一个特殊防护 伞,挡住太阳黑子爆发的区域,减少其对地球的影响.由于太阳相对于地球来说实在是太 大了,我 ...
- Lightoj 1043 - Triangle Partitioning【二分】
题目链接:http://lightoj.com/volume_showproblem.php? problem=1043 题意:一个三角形ABC,DE//BC.已知三角形ADE和四边形BDEC的面积的 ...
- 【软件project】机房收费系统之图形回想
[背景]通过一阶段的学习.自己整理了整理机房收费系统.以下想通过几张图来回顾一下机房的总体流程.此图形仅仅代表鄙人现阶段的理解.本文仅供參考,若有不妥的地方,请积极指正. 1.机房收费系统业务流程图 ...
- 关于React中,map出来的元素添加事件问题
用es6 map 的写法 直接绑定一个onTouchStart 事件不会报错. 用es5的map写法 如果不加上this 会报这个错误 无法读取未定义的属性 解决的方法是 绑定this 就可以了
- 浅析C#组件编程中的一些小细节
控件与组件的区别(Control&Component的区别) 作者:作者不详 发布日期:2011-06-30 12:08:41 控件与组件的区别(Control&Component的 ...