Android基础之fragment

一、fragment与Activity生命周期结合说明

fragment f, Activity a:

创建:f.onAttach()->f.onCreate->f.onCreateView()->f.onViewCreated()---->a.onCreate()->f.onActivityCreated()—>a.onStart()->f.onStart()---->a.onResume()->f.onResume()

销毁:f.onPause()---->a.onPause()->f.onStop()---->a.onStop()->f.onDestroyView()->f.onDestroy()->f.onDetach()---->a.onDestroy()

二、fragment的通信

1、fragment调用activity方法可以使用getActivity

2、activity调用fragment方法可以使用接口

3、fragment调用fragment方法可以使用getActivity的findFragmentByTag/findFragmentById

三、fragment的add、replace、remove方法

add() : 添加fragment 一个一个叠加 

replace() : 替换fragment,如果之前没有则创建,如果有就先将之前所有的fragment移除,再创建

remove() : 移除fragment

addToBackStack() :将fragment添加到任务栈中,这样在点击返回按钮时就可以回到上一个fragment而不是直接退出

四、fragment加载到activity的两种方式

1、静态加载 使用布局

2、动态加载 使用FragmentManager

五、fragment与viewpager结合

FragmentPagerAdapter与FragmentStatePagerAdapter

两者的用法一致

 public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter /FragmentPagerAdapter{

    List<Fragment> fragmentList;

    public MyFragmentStatePagerAdapter(FragmentManager fm, List<Fragment> fragmentList) {
        super(fm);
        this.fragmentList = fragmentList;
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }
}

区别:

FragmentStatePagerAdapter: 源码destroyItem方法中调用mCurTransaction.remove(fragment);移除fragment。当滑动视图时,FragmentStatePagerAdapter会销毁掉不需要的Fragment。销毁Fragment的事务提交后,FragmentManager中对应的fragment会被彻底移除。使用FragmentStatePagerAdapter时,被销毁Fragment可以在自己的onSaveInstanceState函数中保存必要的信息。 当用户切回该Fragment对应界面时,ViewPager会利用保存的信息重新创建Fragment。

FragementPagerAdapter: 源码destroyItem方法中调用mCurTransaction.detach(fragment);分离UI。对于不再需要的fragment,FragementPagerAdapter选择调用Fragment事务的detach方法而非remove方法。 于是,FragementPagerAdapter仅会销毁fragment的视图,但对应的fragment实例还保留在FragmentManager的队列中。

根据FragmentStatePagerAdapter和FragementPagerAdapter对fragment的处理策略, 可以看出FragmentStatePagerAdapter更节省内存。当ViewPager绑定了大量的数据时,应该使用FragmentStatePagerAdapter; 当ViewPager只需要显示少量固定的fragment时,为了效率,就可以使用FragementPagerAdapter。

六、[Android]"commit already called"错误解决

在同一layout里replace不同的Fragment,需要执行多次transaction.commit();每个事务只能执行一次。所以会出现,第一次切换界面没问题,第二次报commit already called。解决办法是:

将manager声明成全局对象:
final FragmentManager manager = getFragmentManager();
在每个item的点击事件里从新实例化transaction
FragmentTransaction transaction = manager.beginTransaction();
transaction.commit();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值