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 获得的方法
主要容器有两种 一种是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 获得的方法