关于Fragment和Activity

同与不同

  • 成员变量

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/

系列文章

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值