CrimainalIntent项目的开发


介绍:CriminalIntent应用能记录陋习的标题,日期以及照片,也支持在联系人当中查找当事人,通过E-mail,Twitter,FaceBook或其他应用提出抗议。把陋习处理完,有了好心情,就可以继续专心做手头上的工作。

• 第7章:项目初步搭建mvc模式,fragment的介绍,生命周期,托管方式,使用fragment的理由。

• 第8章:Crimefragment界面升级,水平模式布局,

• 第9章:创建单例CrimeLab(容纳Crime对象),抽象activity类,RecycleView使用,相应点击时间

• 第10章:fragment数据传递—fragment argument,刷新RecycleView,通过fragment获取返回结果

• 第11章:Viewpager使用,FragmentStatePagerAdapter与FragmentPagerAdapter

思维导图

思维导图


UI fragment与fragment管理器

fragment的生命周期

图7-1 fragment的生命周期图解

1. 使用fragment的前提是,activity知道如何管理fragment,FragmentActivity类知道如何管理支持版本的fragment.

2. Fragment生命周期与activity生命周期的一个关键区别,fragment的生命周期方法是由托管activity而不是操作系统调用,操作系统不关心activity用来管理视图的fragment,fragment的使用是activity内部的事情.

3. 托管的两种方式

• 使用布局fragment,简单但是不够灵活,在activity布局中添加fragment,就等同于将fragment及其视图与activity的视图绑定在一起,并且在activity的生命周期过程中,无法切换fragment视图

• 比较复杂,但是也是唯一可以在运行时控制,fragment的方式,.自行决定何时添加fragment以及随后可以完成何种具体任务,也可以移除fragment,用其他fragment代替,然后重新添加已移除的fragment

4. Fragment.Create(Bundle)是公共方法Activity.onCreate(Bundle)是保护方法.Fragment.oncreate方法以及其他Fragment生命周期方法必须是公共方法,因为托管fragment的activity要调用它们

5. Activity的FragmentManager负责调用队列中fragment的生命周期方法.添加fragment供fragmentManager管理时,onAttach(Activity),oncreate(),onAcivityCreate()方法也会被调用

6. 在activity处在运行状态时,添加fragment, FragmentManager立即驱使fragment行动,执行必要方法, 与activity的最新状态保持同步,一旦fragment的状态与activity的状态保持了同步,托管activity的FragmentManager就会边接收操作系统的调用指令,边调用其他生命周期方法,以保持fragment与activity的状态一致


使用RecyclerView显示列表

1.升级CriminalInent应用的模型层


2.使用抽象activity托管fragment

1.使用抽象类


2.新建控制类:CrimeListActivity和CrlmeListFragment


3.在配置文件中申明CrimeListActivity

...

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme">

android:label="@string/app_name">

运行界面图:

图8-1 列表项


使用布局与组件创建用户界面

运行结果图:

图9-1


使用fragment argument

1.附加argument给fragment

编写newInstance(UUID)方法:

public class CrimeFragment extends Fragment {

private static final String ARG_CRIME_ID ="crime_id";

private Crime mCrime;

private EditText mTitleField;

private Button mDateButton;

private CheckBox mSolvedCheckbox;

public static CrimeFragment newInstance(UUID crimeId) {

Bundle args = new Bundle();

args.putSerializable(ARG_CRIME_ID, crimeId);

CrimeFragment fragment = new CrimeFragment();

fragment.setArguments(args);

return fragment;

}

...

}

使用newInstance(UUID)方法:

public class CrimeActivity extends SingleFragmentActivity {

public static final String EXTRA_CRIME_ID =

"com.bignerdranch.android.criminalintent.crime_id";

private static final String EXTRA_CRIME_ID =

"com.bignerdranch.android.criminalintent.crime_id";

...

@Override

protected Fragment createFragment() {

return new CrimeFragment();

UUID crimeId = (UUID) getIntent()

.getSerializableExtra(EXTRA_CRIME_ID);

return CrimeFragment.newInstance(crimeId);

}

}

CrimeFragment视图:

图10-1 Crime #4列表项的明细内容

刷新显示列表项,应用对象图解更新后:

图10-2 应用对象图解更新版

2.为何要用fragment argument?

Fragment argument的使用还有有点复杂,为什么不直接在CrimeFragment,里创建一个实例变量呢?

创建实例变量的方式并不可靠,因为,操作系统重建fragment时,设备配置发生改变时,用户暂时离开当前应用时,甚至操作系统按需回收内存时,任何实例变量不复存在了,尤其是内存不够,杀掉应用的情况,可以说你无人能挡. 因此,可以说,fragment argument就是为应对上述场景而生.

还有另一个应对上述场景,就是实例状态保存机制,onsaveInstanceState(Bundle)方法, 然而,这种解决方案维护成本高,若干年后,再回头修改老代码,只需一眼就知道,crime id是以argument保存和传递使用,而很可能忘记在onSaveInstanceState(Bundle)方法里保存下来


使用ViewPager

为UI添加ViewPager后,用户可以左右滑动屏幕,切换查看不同列表项的明细页面,如图:

图11-1 滑屏切换显示Crime明细内容

需要完成以下任务:

1.创建CrimePagerActivity类;

2.定义包含ViewPager的视图层级结构;

3.在CrimePagerActivity类中关联使用ViewPager及其Adapter;

4.修改CrimeHolder.onClick(...)方法,转而启动CrimePagerActivity。

图11-2 CrimePagerActivity的对象图解

创建ViewPager

public class CrimePagerActivity extends FragmentActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_crime_pager);

}

}

设置pager adapter

public class CrimePagerActivity extends FragmentActivity {

private ViewPager mViewPager;

private List mCrimes;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_crime_pager);

mViewPager = (ViewPager) findViewById(R.id.activity_crime_pager_view_pager);

mCrimes = CrimeLab.get(this).getCrimes();

FragmentManager fragmentManager = getSupportFragmentManager();

mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {

@Override

public Fragment getItem(intposition) {

Crime crime = mCrimes.get(position);

return CrimeFragment.newInstance(crime.getId());

}

@Override

public int getCount() {

return mCrimes.size();

}

});

}

}


易错点

1.导错包:例如:

package com.bignerdranch.android.criminalintent;

import android.support.v4.app.Fragment;

public class CrimeFragment extends Fragment {

}

很有可能导成android.app.Fragment

2.单词拼写错误

3.尽管fragment有自己的statrtActivityForResult()和onActivityResult()方法,但却没有setResult方法,要用activity中的setResult方法

4.DateFormat.getTimeFormat(this).format(new Date());时分

DateFormat.getDateFormat(this).format(new Date());年月日

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,424评论 25 707
  • 介绍:CriminalIntent应用能记录陋习的标题,日期以及照片,也支持在联系人当中查找当事人,通过E-mai...
    19377b7fb478阅读 543评论 0 1
  • HIGO网络。。 问我的是MySQL的存储问题。 一个长url怎么存储,对应到服务端的短url,怎么进行存储呢? ...
    followyounger1阅读 472评论 0 1
  • 风不罢休地吹响很多泛滥 它想遮蔽了你心底的呼唤 风里的沙土不是心甘情愿 它不想迷了那寻找你的眼 大风吹呀 吹不停 ...
    西城的北阅读 506评论 0 2
  • 五月的最后一个周天 37摄氏度 五十岁左右的眼镜男子 是鲜花店老板 和一只狗 生活着 简单而美好
    高手段阅读 101评论 0 0