同与不同
- 成员变量
Fragment、ViewPager里的成员变量,分为基本类型、引用类型。基本类型如int,引用类型如List。该类型成员变量,不论final、static,直接粘贴复制。
成员变量里,可能存在实例化的类。如View、Adapter。如果是View,需要注意下视图xml的变量名,将里面的变量名如@+/id=“item_clicked”,更改成@+/id=“activity_item_clicked”。如果是Adapter,一般需要分析下业务逻辑,业务Adapter需要粘贴复制,ViewPager的Adapter直接优化删除。
- 成员方法
任何“眼熟”的代码逻辑,出现3次,说明这段代码可以优化,可以抽为一个行为对象、数据对象。任何“眼熟”的代码逻辑,出现5次,说明这位程序员的开发功力,十分糟糕。代码逻辑就是方法。
剥离代码时,成员方法冗余的,比如在Fragment里初始化界面,但是新的Activity里不存在界面,这种冗余方法可以归类、删除。 成员方法的业务逻辑重要的,保留原有位置,方便查看History。对新的Activity,里面逻辑判断冗余、逻辑判断不足的,优化方法。对一部分业务代码,感觉在阅读时、在执行时,不舒服,直接生成新的方法。
- 状态方法
保证剥离代码后的方法,是一个比较稳定的状态积。
- Activity的生命周期
onCreate()
onStart()
onResume()
onPasue()
onStop()
onDestory()
onRestart()
onSaveInstantState()
onRestoreInstantState()
Fragment的生命周期
onAttach()
onCreate()
onDestory()
onDetach()
//这四个状态方法一般在宿主Activity里,不需要关注。
onCreatedView()
onActivityCreated()
onStart()
onResume()
onPause()
onStop()
onDestoryView()
//跟Activity的状态方法是一致的。
需要注意的事,耗时操作不能放在Fragment的onCreateView()里,因为这个是界面展示前的状态,也不能放在Activity的onCreate()里。在Fragment的onDestoryView()里做一些对象引用制空,可以改变对象的JVM内存类型,从强引用变为虚引用,让GC回收。这部分操作也剥离至Activity的ondestory()里。
新的Activity,要酌情设置启动模式。
- 界面优化
Activity本质,是个View+XML+SystemStateContorl+…
Fragment本质,是个View+XML+SystemStateContrl(smaller)+…
Activity不具备Fragment的懒加载,不能使用View对象做缓存,这个点确实没有想通。一般都是Activity改成Fragment,这样便于轻量级操作。但是物极必反,Fragment剥离成Activity,也是有一定道理的。
界面优化,重点关注下动画效果。重点关注下去掉Fragment的Adapter后,一部分数据的接口回调。
链接:https://www.jianshu.com/p/5529d79cff11
将Activity改为Fragment
从Activity到Fragment最大的变动在于,在Fragment里面的onCreate()函数内,是没有办法使用findViewById、setContentView这些函数的。因为Fragment本身并没有提供这些方法。于是我们只能通过onCreateView和onViewCreated来实现对显示的控制。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.about_detail, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
version = (TextView) view.findViewById(R.id.version);
loginfo = (TextView) view.findViewById(R.id.loginfo);
}
而一些Fragment没有提供的属于Activity的函数我们可以通过getActivity()得到作为parent的Activity来调用,因为Fragment只是作为片段提供给Activity使用的,所以很多功能的实现都被留在了Activity里面。不过无论如何,只要利用Eclipse自带的查错功能可以非常快速的完成这些操作。这种改动一般不会很复杂,只要把Fragment要做的事情交给作为parent的Activity处理就可以了。比如像Intent的处理就可以这样:
Intent i = new Intent();
i.setClass(getActivity().getApplicationContext(), NewActivity.class);
startActivity(i);
getActivity().finish();
链接:https://blog.ch-wind.com/android简单的将activity改为fragment/