02.CriminalIntent应用开发阶段总结
一、在上篇文章中,我们跟随本书作者,使用了单个的Fragment做了最简单的插入操作。本篇文章将跟随作者进行更深入的完善各种功能。
本章目标:
-
使用ListFragment显示列表
-
fragment之间传递数据
-
使用ViewPager来实现划屏显示 对话框
二、使用ListFragment显示列表
以达到如下的效果:
1.资源相关
在这个UI中所有的数据都是根据动态数据显示的,因为没有用到任何图片资源或者字符串资源。所以没有修改的地方。
2.数据相关
现在需要显示一串数据,书中新增了一个可以容纳多个Crime对象ArrayList类。它定义了2个私有变量
private static CrimeLab sCrimeLab;
private Context mAppContext;
s开头的变量是开发的命名约定。它代表了变量sCrimeLab是一个静态变量。
这个类的代码现阶段如下:
package com.example.lijing.criminalintent;
import android.content.Context;
/**
-
Created by lijing on 2017/9/18.
*/
public class CrimeLab {
private static CrimeLab sCrimeLab;
private Context mAppContext;public CrimeLab(Context appContext) {
mAppContext = appContext;
}public static CrimeLab get(Context c) {
if (sCrimeLab == null) {
sCrimeLab = new CrimeLab(c.getApplicationContext());
}
return sCrimeLab;
}
}
3.逻辑相关
下图是CriminalIntent应用的整体规划设计
4视图相关
需要在res/layout/list_item_crime.xml中的如下:
5.给CrimeFragment填充数据
使用之前学到的方法用Intent传递数据,在CrimeFragment的onCreate()中从Intent读取数据。
首先定义一个id
public static final String EXTRA_CRIME_ID =
"com.example.lijing.criminalintent.crime_id";
…..
然后在onCreate()中
UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID);
mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
数据在CrimeListFragment中startActivity()之
putExtra(CrimeFragment.EXTRA_CRIME_ID,c.getId());
完成后界面是这个样子:
6.使用ViewPager来实现划屏显示
为了实现这个效果,我们需要创建一个ViewPager的activity,命名为CrimePagerActivity来取代CrimeActivity。本章采用了以代码的方式创建视图它包含以下步骤:
为ViewPager创建资源ID;
创建ViewPager实例并赋值给mViewPager;
赋值资源ID给ViewPager,并对其进行配置;
设置ViewPager为activity的内容视图。
创建独立资源ID(res/values/ids.xml)
定义独立资源ID与定义字符串资源ID并没有什么不同:在res/values目录下的XML文件中创建一个项目元素。创建一个名为res/values/ids.xml的Android XML 资源文件。
以代码的方式创建内容视图(CrimePagerActivity.java)
mViewPager = new ViewPager(this);
mViewPager.setId(R.id.viewPager);
setContentView(mViewPager);
然后我们使用FragmentStatePagerAdaper为我们的代理,负责管理与ViewPager的对话并协同工作。
7.对话框
在我们CrimeFragment对应的详细信息界面里有一个时间设置按钮。现在我们就按照书中的要求完善这个按钮的对话框。
作者采用将AlertDialog封装在DialogFragment的方法来显示对话框,因为有如下优点:
使用FragmentManager管理对话框,可以使用更多配置选项来显示对话框;
发生旋转时封装在fragment中的AlertDialog不会消失
在屏幕上显示DialogFragment时,托管activity的FragmentManager会调用onCreateDialog()。在onCreateDialog里我们需要返回一个AlertDialog.Builder。
在显示对话框的时候要注意。要将DialogFragment添加给FragmentManager管理并放置到屏幕上,可以调用fragment的show方法。
Public void show (FragmentManager manager, String tag)
Public void show(FragmentTransactiong transaction, String tag)
String参数是用来队列中的DialogFragment。在FragmentManager和FragmentTransaction的选择上,书中选择了FragmentManager因为传入这个参数,事物可以自动创建提交。
最简单的界面效果如下: