Android基础--------fragment

fragment 俗称碎片    

主要容器有两种    一种是FrameLayout   另一种是ViewPager  

fragment比起activity方便之处有很多  比如 动态添加  移除 等
1.在frameLayout 中  
  具体步骤:
   1.获取一个fragmentManager
   2.开启事务
   3.创建一个fragment实例
   4.替换实例对象
   5.添加返回栈
   6.提交事务

具体代码如下:

  FragmentManager fragmentManager = getFragmentManager();
  FragmentTransaction ft = fragmentManager.beginTransaction();
  BackgroudFragment fragment_backgroud = new BackgroudFragment();
  ft.replace(R.id.fl_background, fragment_backgroud);
  //开启一个fragment的加载动画  也可以没有  
  ft.setCustomAnimations(R.anim.slide_activity_start_in, -1,
                -1, R.anim.slide_activity_finish_out);
  ft.replace(R.id.fl_menu, FilterFragment.newInstance(isPagerChanged));
  //添加到返回栈中  按下back键不会直接退出activity 而是退出该fragment
  ft.addToBackStack(null);
  ft.commit();


2.在viewpager中 就不需要这么复杂了,因为viewpager是使用adapter的所以只需要在数据源中添加一个新的fragment实例然后刷新一下viewpager 即可

在V4包中 提供了两种ViewPager中使用Fragment 的适配器  FragmentPagerAdapter  和  FragmentStatePagerAdapter



 FragmentPagerAdapter拥有自己的缓存策略,当和ViewPager配合使用的时候,
会缓存当前Fragment以及左边一个、右边一个,一共三个Fragment对象。

假如有三个Fragment,那么在ViewPager初始化之后,3个fragment都会加载完成,
中间的Fragment在整个生命周期里面只会加载一次,
当最左边的Fragment处于显示状态,最右边的Fragment由于超出缓存范围,
会被销毁,当再次滑到中间的Fragment的时候,最右边的Fragment会被再次初始化。



FragmentStatePagerAdapter是PagerAdapter的子类,这个适配器对实现多个Fragment界面的滑动是非常有用的,
它的工作方式和listview是非常相似的。当Fragment对用户不可见的时候,整个Fragment会被销毁,
只会保存Fragment的保存状态。基于这样的特性,FragmentStatePagerAdapter比FragmentPagerAdapter
更适合用于很多界面之间的转换,而且消耗更少的内存资源。


FragmentManager  

获取最好是使用getSupportFragmentManager()  这样方便兼容 (fragment是android 3.0加入的 为了兼容版本使用v4包)


FragmentManager 是用来管理Fragment 的   

主要用法有增删改    使用FragmentManager来管理Fragment是不在Viewpager中使用fragment时


1.获取
FragmentManager supportFragmentManager = getSupportFragmentManager();
2.开启事务
FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
3.开始管理Fragment
可以使用add remove  replace hide等方法  最后 使用commit提交管理   使用hide(this)隐藏当前fragment 退回来的时候可以保存数据
 
addToBackStack(null);该方法可以使弹出fragment的时候 按下回退键只退出该fragment 不会导致activity被退出



fragment 和activity 中进行通信有两种方法  
1.通过get  set方法  
  该方法需要手动在相应的activity 或者fragment中创建 然后获取相应的activity或者fragment实例进行传值  

2.通过系统api  setArguments();  getArguments() 进行传值  这两种方法都是在framgnt 使用
               setArguments() 一般在fragment的构造方法中使用     getArguments()方法在改fragment中使用


补充 谷歌的官方寻找fragment实例的方法  在viewpager 中

 public Fragment getCurrentFragment(int position) {
      String fragmentTag = "android:switcher:" + R.id.vp(ViewPager的ID) + ":" + position;
      return  fm.findFragmentByTag(fragmentTag);
 }

其中最前面是固定的 中间是viewpager 的id  最后面是fragment 是第几个fragment


另外一中方法  是通过fragmentManager的findViewByid方法

代码    Fragment  fragment=getFragmentManager().findFragmentById(R.id.xxx);



在fragment中获取Activity对象就很简单的 只需要调用getActivity() 方法并进行强制转换即可(因为他们都是context的子类)


fragment的生命周期   和 Activity的生命周期非常想

onAttach()    onCreate()  onCreateView()  onActivityCreated()     onStart()   onResume()   onPause()

onStop()    onDestroyView()     onDestory()   onDetach()




fragment 意外销毁 保留状态   

方法一 保留fragment实例      如横竖屏切换等

在fragment 的onCreate方法中  增加一行代码  setRetainInstance(true);
该代码会让

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setRetainInstance(true);
}



fragment 和Viewpager 共同使用的时候  

取巧方法。。。  不建议使用 如果项目比较急

viewpager.setOffscreenPageLimit(2);   设置viewpager多缓存一个页面 如果你的viewpager中页面数比较少的话 同时不在意内存消耗



类似于Activity 的保存和取出方式

两种方法   
存的方法   onSaveInstanceState(Bundle outState)
取得方法   onViewStateRestored(@Nullable Bundle savedInstanceState)  


比较简单的做法    

grilde 中添加依赖   compile 'com.inthecheesefactory.thecheeselibrary:stated-fragment-support-v4:0.9.1'  

然后自己的fragment 继承StatedFragment    
需要保存数据就写在   onSaveState() 方法 和  方法中  
取出数据写在 onRestoreState() 中

如果想要在第一次加载数据的时候干些什么 重写 onFirstTimeLaunched()方法  该方法只会在第一次调用时 被使用

大概原理   onSaveInstanceState   和 onDestroyView中 都写了保存的方法     取出时在onCreateActivity 以及 onViewStateRestored中取出  参数中都含有bundle   getArgument 获得的方法

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值