《Android实战基础教程》课件第十章_第1页
《Android实战基础教程》课件第十章_第2页
《Android实战基础教程》课件第十章_第3页
《Android实战基础教程》课件第十章_第4页
《Android实战基础教程》课件第十章_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录10.1Fragment在项目中的使用10.2控件交互在项目中的使用10.3RecyclerView在项目中的使用

十、

习惯记录系统十、习惯记录系统Fragment是Android3.0引入的新API,它代表了Activity的子模块,它必须被“嵌入”Activity中使用,因此虽然Fragment拥有自己的生命周期,但Fragment的生命周期会受到它所在的Activity的生命周期控制。10.1Fragment在项目中的使用10.1.1Fragment介绍十、习惯记录系统Fragment的特征:

作为Activity界面的组成部分。Fragment可调用getActivity()方法获取它所在的Activity,Activity可调用FragmentManager的findFragmentById()或findFragmentByTag()方法来获取Fragment。

在Activity运行过程中,可调用FragmentManager的add()、remove()、replace()方法动态地添加、删除或替换Fragment。

一个Activity可以同时组合多个Fragment;反过来,一个Fragment也可以被多个Activity复用。十、习惯记录系统Fragment存在四种生命周期状态:

活动状态:当前Fragment位于前台,用户可见,可以获得焦点。

暂停状态:其他Activity位于前台,该Fragment依然可见,只是不能获得焦点。

停止状态:该Fragment不可见,失去焦点。

销毁状态:该Fragment被完全删除,或该Fragment所在的Activity被结束。10.1.2Fragment的生命周期十、习惯记录系统右图显示了Fragment生命周期及相关回调方法。从图可以看出,在Fragment生命周期中,一些方法会被回调。

开发Activity时可以根据需要选择性地覆盖指定方法,开发Fragment时也可根据需要选择性地覆盖指定方法,其中最常见的就是覆盖onCreateView()方法,该方法返回的View将由Fragment显示出来。图10.1十、习惯记录系统APP中需要一个Activity来管理一个CrimeFragment,用来显示习惯列表。这个Activity名为CrimeActivity,同时创建一个习惯类,用于表示每个习惯,习惯流程图如图。10.1.3习惯记录系统创建图10.2十、习惯记录系统

在图10.3中将展示该APP的对象图标,以及第一个版本所需要用到的相关类。有三个类展示出来,将完成:Crime、CrimeFragment、CrimeActivity。(1)一个Crime对象将表示一个办公室习惯。在这一节中,一个习惯仅仅包含一个标题和一个id。标题是习惯的描述性内容。id标记一个独特的Crime实例。(2)CrimeFragment:有一个成员变量(mCrime);界面由一个LinearLayout和一个EditText组成;CrimeFragment包含一个EditExt的成员变量(mTitleField),同时为它设置了监听器由于监听内容的改变。(3)CrimeActivity的界面由FrameLayout组成,在FrameLayout区域显示Fragment的内容。十、习惯记录系统图10.3十、习惯记录系统

创建一个新的Android项目,项目名字为CriminalIntent,包名为com.alex.criminalIntent,最低版本选择API14,编译版本默认选择最高编译版本:图10.4十、习惯记录系统

点击Next,创建CrimeActivity,最后点击完成:图10.5十、习惯记录系统

在支持包中有两个非常重要的类:Fragment和FragmentActivity。使用Fragment时需要Activity知道如何管理Fragment,而FragmentActivity就是用于管理支持包中的Fragment的。

由于项目创建时会自动包含V4支持包,因此可以直接使用支持包中的Fragment。

在项目packageexplorer视图中,打开CrimeActivity.java,改变CrimeActivity的继承类为FragmentActivity。代码如下:10.1.4Fragment与支持包十、习惯记录系统

现在创建Model层的实体类Crime,选择包名,单击右键创建类Crime。

在Crime.java中,添加如下代码:十、习惯记录系统十、习惯记录系统

1.代管Fragment

使用Activity管理一个UIFragment时需要注意以下两点:(1)在Activity布局文件中给Fragment指定一个区域显示。(2)管理Fragment实例的生命周期。2.两种方式代管Fragment(1)在Activity的布局文件中增加Fragment。(2)在Activity的代码中添加Fragment。10.1.5Fragment的应用十、习惯记录系统3.定义一个containerView

首先在Activity的代码中添加一个Fragment,但是在这之前必须在Activity的View层级树中为Fragment指定一块显示区域。CrimeActivity的布局文件如下所示:

至此,我们可以通过代码把Fragment插入到这个FrameLayout中,但在此之前,需要创建一个Fragment。十、习惯记录系统4.创建Fragment创建Fragment的步骤与创建Activity的步骤:(1)通过布局文件创建用户界面。(2)创建一个类,同时将布局文件绑定为它的View。(3)在代码中获得布局文件中的控件进行操作。十、习惯记录系统5.定义CrimeFragment的布局Crime实例的消息将通过CrimeFragment展示出来,包括文字、图片等等。在Fragment的布局文件中,只需要一个EditText控件。EditText是一个用户可以增加和编辑文本的控件。Fragment_xml布局文件代码如下:十、习惯记录系统十、习惯记录系统6.创建CrimeFragment

在项目中创建CrimeFragment,使之继承Fragment类,需要注意的是,Fragment有两个不同包名的Fragment类,一个为Fragment(android.app),一个为Fragment。前者是一个由Android自带的Fragment,需要的是支持包版本的Fragment,所以选择android.support.v4.app版本的Fragment:十、习惯记录系统7.实现Fragment生命周期方法CrimeFragment是模型与视图交互的控制器。该类的主要工作是显示习惯详情以及更新。这些控制内容主要在生命周期方法中实现,这些生命周期方法与Activity类似,比如OnCreate(Bundle)方法。

在CrimeFragment.java中增加Crime成员对象和一个继承的onCreate()方法,代码如下所示:十、习惯记录系统(1)Fragment的onCreate(Bundle)方法是public修饰的方法,而Activity的onCreate(Bundle)方法是protected修饰,这是因为Fragment的生命周期方法会被代管的Activity所调用。(2) Fragment与Activity一样也可以通过Bundle对象保存获取状态。

在CrimeFragment.java中增加继承生命周期方法onCreateView()来加载布局文件。代码如下:十、习惯记录系统十、习惯记录系统FragmentManager可以处理两个事情:Fragment集合和Fragment事务的回退栈。在本案例中,只需要关注Fragment集合。在CrimeActivity.java中增加以下代码:十、习惯记录系统8.FragmentTransactions

通过FragmentManager可以将Fragment添加进去并管理此Fragment。十、习惯记录系统

在上述代码中,fm.beginTransaction()方法创建并且返回一个FragmentTransaction实例,该实例在配置FragmentTransaction时使用流接口返回FragmentTransaction而不是返回void,这样在配置FragmentTransaction时可以连着一起写然后再提交。Add()方法是FragmentTransaction事务管理方法之一。它有两个参数:容器id和需要管理的Fragment。在本案例中是R.id.fragment_container以及CrimeFragment。

带有id的容器空间主要有两个目的:(1)通知FragmentManager代管的Fragment出现在Activity界面的哪个区域。(2)在FragmentManager的集合中作为Fragment的独一无二的标识符用于区分。

当需要从FragmentManager中得到CrimeFragment时,可以通过容器id得到。十、习惯记录系统

通过FragmentManager的findFragmentById()方法得到Fragment。如果在FragmentManager中没有Fragment,则创建一个新的;有则直接返回该对象。十、习惯记录系统运行程序:图10.6十、习惯记录系统

在Eclipse中打开Crime.java类,增加两个属性mDate和mSolved,mDate表示习惯发生的时间,而mSolved表示习惯是否已经解决。在Crime.java中增加代码如下所示:10.2控件交互在项目中的使用10.2.1更新Crime十、习惯记录系统

在Eclipse中Date类自动导包时注意需要导入java.util.Date,否则将会报错。在Crime的构造方法中得到mDate对象,接下来对mDate、mSolve进行封装,添加get、set方法。在Crime中增加代码如下所示:十、习惯记录系统

更新布局文件的代码:10.2.2更新Crime十、习惯记录系统十、习惯记录系统

上面的Button没有给该控件初始化文字。这个按钮的功能是展示习惯发生日期,将在代码中初始化文字。

在上述代码中又用到一些字符串资源,字符串代码修改如下:十、习惯记录系统

在CrimeFragment.java中更新代码,对布局代码更新的控件进行连接,增加两个成员变量代码如下:10.2.3连接控件十、习惯记录系统

在onCreateView()方法中得到布局文件的button实例,再让button按钮显示日期。在onCreateView方法中增加了对CheckBox的事件监听以及相应的处理。自此,布局文件的更新已经完成。十、习惯记录系统

在本节中,我们将更新习惯记录列表。这个列表将展示每一个习惯的标题、时间以及是否已经解决。展示习惯列表需要在应用的控制层(Controller)更新Activity和Fragment,在模型层(Model)也增加新的实体类CrimeLab,在此实体类中将保存Crime对象集合。在View层,将使用一个新的控件RecyclerView,通过此控件展示习惯列表,如图10.7所示。10.3RecyclerView在项目中的使用十、习惯记录系统图10.7十、习惯记录系统

更新该应用的Model层就是将单个Crime对象更新为Crime对象列表。在这里将通过单例来存储Crime列表。单例类是指该类只能被创建一次。

当需要创建单例时,该类的构造方法必须为私有的,同时提供静态的get()方法。如果实例已经存在,通过get()方法得到该对象;如果实例不存在,get()方法将调用构造器创建一个实例。代码如下:10.3.1更新应用Model层十、习惯记录系统

在CrimeLab类中,定义了一个静态的成员变量sCrimeLab,同时构造方法也适用,当其他类需要CrimeLab时,只需要调用静态方法get()就可以得到实例对象。十、习惯记录系统

给CrimeLab添加一些Crime对象用于存储。在CrimeLab的构造方法中,创建一个空的Crimes集合,同时增加两个方法:getCrimes()和getCrime(UUID),前者返回一个Crime集合,后者返回一个Crime对象:十、习惯记录系统

给mCrimes的集合增加数据,在构造方法中增加代码:十、习惯记录系统1.使用一个抽象Activity代管Fragment

创建CrimeListActivity类来代管CrimeListFragment。第一步需要为CrimeListActivity创建界面布局。在前面的CrimeActivity中,我们使用activity_crime.xml作为布局文件,这个布局文件将FrameLayout作为容器。但是activity_crime.xml仅仅提供了一个容器,没有其他控件,可以将它作为一个通用的Fragment的布局文件,将此文件重命名为activity_fragment.xml。这样当Activity仅作为Fragment的代管者时,都可以使用该布局文件。记得在之前的CrimeActivity.java的onCreate()方法中修改setContentView()参数。十、习惯记录系统

在创建CrimeListActivity时,可以重用前面CrimeActivity的代码。在CrimeActivity的代码中,当需要代管一个Fragment时,唯一不同的是Fragement对象的不同。为了避免代码重复,可以定义一个抽象类。

在应用中创建一个抽象类SingleFragmentActivity,同时继承FragmentActivity。通过一个抽象方法得到Fragment对象,这样其子类只需要实现该抽象方法就能得到Fragment对象。十、习惯记录系统十、习惯记录系统3.使用抽象类

改变前面所写的CrimeActivity类,将CrimeActivity的父类改变为SingleFragment-Activity,删除其实现的onCreate()方法,同时实现父类的SingleFragmentActivity的createFragment()方法:十、习惯记录系统4.创建新的控制器

创建新的控制器类CrimeListActivity和CrimeListFragment,并实现其父类的方法。

CrimeListFragment继承了支持包的Fragment,暂时无方法。代码如下:十、习惯记录系统5.注册CrimeListActivityCrimeListActivity通过代码继承SingleFragmentActivity之后,需要在清单文件中注册该Activity,将CrimeListActivity作为其登录界面,只需要在其注册文件中增加上述代码中的<intent-filter>即可。十、习惯记录系统RecyclerView的功能是回收TextView以及将它们部署到屏幕上。此处需要用到两个类:一个Adapter的子类以及一个ViewHolder的子类。相比而言,ViewHolder的工作量更小,所以先讲述ViewHolder的功能。ViewHolder做的主要事情如图所示。在ListView中,在其适配器的getView方法中,ListView需要展示多少个item就需要创建多少个item的View对象;而在RecyclerView中,RecyclerView并不直接创建View对象,而是通过创建RecyclerView对象,通过RecyclerView对象对View的引用来减少内存中对象个数以及访问布局文件的次数。10.3.2RecyclerView、Adapter和ViewHolder图10.81.ViewHolderAndroidAdapter十、习惯记录系统2.AdapterAdapter是一个控制器类,它是RecyclerView和数据之间的桥梁,通过Adapter将数据显示到RecyclerView界面中。RecyclerView的适配器主要负责:

创建需要的ViewHolder。

将model的数据绑定到ViewHolder中。

创建RecyclerView的适配器需要继承RecyclerView.Adapter,通过此适配器将把CrimeLab中的Crime集合显示到RecyclerView上。

当RecyclerView需要展示一个View对象时,它将与Adapter联系。图10.9列出了RecyclerView与Adpter的联系调用关系。十、习惯记录系统

首先,RecyclerView调用Adapter的getItemCount()方法来知晓有多少个item。

接下来,RecyclerView得到item的数目后,调用Adapter的createViewHolder(ViewGroup,int)方法来创建新的ViewHolder。

最后,RecyclerView调用onBindViewHolder(ViewHolder,int)。图10.9十、习惯记录系统RecyclerView是Android支持库中的一个类,故使用RecyclerView的第一步就是导入对应的支持库。在SDK的文件目录中找到extras文件夹,找到v7包中对应的android-support-v7-recyclerview.jar文件并将其导入到项目中即可。

在res/layout目录下,创建fragment_crime_list布局文件,同时修改其根容器为RecyclerView:10.3.3使用RecyclerView十、习惯记录系统

同时在CrimeListFragment中做修改:十、习惯记录系统1.实现Adapter和ViewHolder

在CrimeListFragment中定义一个集成ViewHolder的内部类:十、习惯记录系统

在CrimeListFragment内创建RecyclerView.Adapter的继承类CrimeAdapter:十、习惯记录系统Adapter创建完成之后,只需要将该Adapter传递给RecylerView即可。在CrimeListFragment中增加updateUI()方法,并添加到onCrea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论