资讯专栏INFORMATION COLUMN

Fragment 使用详解

ningwang / 1988人阅读

摘要:必须嵌套在中,其生命周期受生命周期的影响。利用实现此类设计时,您无需管理对视图层次结构的复杂更改。您应该将每个都设计为可重复使用的模块化组件。使用与进行交互开启事务将填充到创建的容器中提交事务。

极力推荐文章:欢迎收藏
Android 干货分享

阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

</>复制代码

  1. Fragment 的设计原理

  2. Fragment 的生命周期

  3. Fragment 在宿主Activity 中的生命周期

  4. Fragment 在Activity 中的使用方法

  5. Activity获取 Fragment 的方法

  6. Fragment 获取宿主Activity 的方法

  7. 两个Fragment 通讯的方法

  8. Fragment 与Activity 通讯方法

Fragment 片段,在Activity 中常用于负责用户界面部分,可以将多个Fragment 组合在一个Activity中来创建多窗口UI,或者在Activity中重复使用某个Fragment。您可以将Fragment 视为Activity的模块化组成部分,Fragment 具有自己的生命周期,能接收自己的输入事件,并且可以在Activity 运行时候添加或者移除Fragment

Fragment 必须嵌套在Activity中,其生命周期受Activity生命周期的影响。

Fragment 简介 Fragment 继承关系如下:

</>复制代码

  1. java.lang.Object
  2.    ↳ android.app.Fragment
1. Fragment的设计原理

Fragment 主要是为了给大屏幕(平板等)上更加动态和灵活的UI设计提供支持。由于平板电脑的屏幕比手机屏幕大得多,因此可用于组合和交换UI 组件的空间更大。利用Fragment 实现此类设计时,您无需管理对视图层次结构的复杂更改。 通过将 Activity 布局分成Fragment,您可以在运行时修改 Activity 的外观,并在由 Activity 管理的返回栈中保留这些更改。

您应该将每个Fragment都设计为可重复使用的模块化 Activity 组件。也就是说,由于每个Fragment 都会通过各自的生命周期回调来定义其自己的布局和行为,您可以将一Fragment加入多个 Activity,因此,您应该采用可复用式设计,避免直接从某个Fragment直接操纵另一个Fragment。 这特别重要,因为模块化片段让您可以通过更改Fragment的组合方式来适应不同的屏幕尺寸。 在设计可同时支持平板电脑和手机的应用时,您可以在不同的布局配置中重复使用您的Fragment,以根据可用的屏幕空间优化用户体验。 例如,在手机上,如果不能在同一 Activity 内储存多个片段,可能必须利用多带带片段来实现单窗格 UI

2.Fragment 生命周期

Fragment生命周期图

Fragment 生命周期回调方法

</>复制代码

  1. public void onAttach(Context context) {
  2. // TODO Auto-generated method stub
  3. Log.i(TAG, "----onAttach----");
  4. super.onAttach(context);
  5. }
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. Log.i(TAG, "----onCreate----");
  9. // 在Fragment 中调用Activity 中的方法
  10. ((FragmentAutoCreate) getActivity()).test();
  11. // TODO Auto-generated method stub
  12. super.onCreate(savedInstanceState);
  13. }
  14. @Override
  15. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  16. Bundle savedInstanceState) {
  17. Log.i(TAG, "----onCreateView----");
  18. // 将layout布局转换成View
  19. View view = inflater.inflate(R.layout.fragment_left_layout, null);
  20. Toast.makeText(getActivity(),
  21. "通过对外提供方法setMsg(String msg),供Activity 调用", 0).show();
  22. return view;
  23. }
  24. @Override
  25. public void onActivityCreated(Bundle savedInstanceState) {
  26. Log.i(TAG, "----onActivityCreated----");
  27. // TODO Auto-generated method stub
  28. super.onActivityCreated(savedInstanceState);
  29. }
  30. @Override
  31. public void onStart() {
  32. Log.i(TAG, "----onStart----");
  33. // TODO Auto-generated method stub
  34. super.onStart();
  35. }
  36. @Override
  37. public void onResume() {
  38. Log.i(TAG, "----onResume----");
  39. // TODO Auto-generated method stub
  40. super.onResume();
  41. }
  42. @Override
  43. public void onPause() {
  44. Log.i(TAG, "----onPause----");
  45. // TODO Auto-generated method stub
  46. super.onPause();
  47. }
  48. @Override
  49. public void onStop() {
  50. Log.i(TAG, "----onStop----");
  51. // TODO Auto-generated method stub
  52. super.onStop();
  53. }
  54. @Override
  55. public void onDestroyView() {
  56. Log.i(TAG, "----onDestroyView----");
  57. // TODO Auto-generated method stub
  58. super.onDestroyView();
  59. }
  60. @Override
  61. public void onDestroy() {
  62. Log.i(TAG, "----onDestroy----");
  63. // TODO Auto-generated method stub
  64. super.onDestroy();
  65. }
  66. @Override
  67. public void onDetach() {
  68. Log.i(TAG, "----onDetach----");
  69. // TODO Auto-generated method stub
  70. super.onDetach();
  71. }
3.Fragment 在宿主Activity 的生命周期

Fragment 不能脱离Activity而存在,其生命周期受Activity 生命周期影响

4.Fragment 在Activity中的使用方法 1.静态添加Fragment到Activity 1.创建自定义Fragment类

实现方法如下

</>复制代码

  1. public class FragmentRight extends Fragment {
  2. @Override
  3. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  4. Bundle savedInstanceState) {
  5. // 将layout布局转换成View
  6. View view = inflater.inflate(R.layout.fragment_right_layout, null);
  7. // 取出值
  8. Bundle values = getArguments();
  9. if (values != null) {
  10. String str = values.getString("key", "");
  11. Toast.makeText(getActivity(), "接收Activity传递的至为:" + str, 0).show();
  12. } else {
  13. Toast.makeText(getActivity(), "接收Activity传递的至为空", 0).show();
  14. }
  15. return view;
  16. }
  17. }
2.在Activity 的xml中引用 标签

</>复制代码

2. 动态添加Fragment到Activity中 1.创建自定义Fragment类 同上

</>复制代码

  1. public class FragmentRight extends Fragment {
  2. @Override
  3. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  4. Bundle savedInstanceState) {
  5. // 将layout布局转换成View
  6. View view = inflater.inflate(R.layout.fragment_right_layout, null);
  7. // 取出值
  8. Bundle values = getArguments();
  9. if (values != null) {
  10. String str = values.getString("key", "");
  11. Toast.makeText(getActivity(), "接收Activity传递的至为:" + str, 0).show();
  12. } else {
  13. Toast.makeText(getActivity(), "接收Activity传递的至为空", 0).show();
  14. }
  15. return view;
  16. }
  17. }
2.创建Fragment填充布局载体

</>复制代码

3.使用FragmentManager动态填充

1.创建容器接收Fragment Activity容器。
2.使用FragmentManagerFragment 进行交互
3.开启事务将Fragment 填充到Activity 创建的容器中
4.提交事务。

</>复制代码

  1. public class FragmentAutoCreate extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. // TODO Auto-generated method stub
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_fragment_autocreate);
  7. // 获取fragmentManager --->开启事务--->容器中填充内容--->提交事务
  8. // FragmentManager : Activity 内部用来与Fragment进行交互的接口
  9. FragmentManager fragmentManager = getFragmentManager();
  10. // 开启一个事务
  11. FragmentTransaction transaction = fragmentManager.beginTransaction();
  12. // 将左右两侧的Fragment 添加的R.id.fl_left 所代表的容器视图中
  13. FragmentLeft leftFragment = new FragmentLeft();
  14. transaction.add(R.id.fl_left, leftFragment, "left_tag");
  15. // 1. 调用 Fragment 对外提供的方法
  16. leftFragment.setMsg("tttt");
  17. FragmentRight rightFragment = new FragmentRight();
  18. // 2. Activity --setArguments-> 创值给Fragment
  19. Bundle args = new Bundle();
  20. args.putString("key", "Activity --setArguments-> 创值给Fragment ");
  21. // 传递数据
  22. rightFragment.setArguments(args);
  23. transaction.add(R.id.fl_right, rightFragment);
  24. // transaction.replace(R.id.fl_right, rightFragment);
  25. // transaction.hide(rightFragment);
  26. transaction.show(rightFragment);
  27. // 提交事务
  28. transaction.commit();
  29. }
  30. public void test() {
  31. }
  32. }
5.Activity 中获取Fragment

</>复制代码

  1. Fragment idFragment=getFragmentManager().findFragmentById(R.id.fl_left);
  2. FragmentRight tagFragment = (FragmentRight) getFragmentManager().findFragmentByTag("left_tag");
6.Fragment 获取宿主Activity的方法

getActivity() 方法获取宿主Activity

</>复制代码

  1. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  2. Bundle savedInstanceState) {
  3. Log.i(TAG, "----onCreateView----");
  4. // 将layout布局转换成View
  5. View view = inflater.inflate(R.layout.fragment_left_layout, null);
  6. Toast.makeText(getActivity(),
  7. "通过对外提供方法setMsg(String msg),供Activity 调用", 0).show();
  8. return view;
  9. }
7.两个Fragment的通讯的方法

通过宿主ActivityFragmentManger 方法获取不同的Fragment

</>复制代码

  1. Fragment idFragment=getFragmentManager().findFragmentById(R.id.fl_left);
  2. FragmentRight tagFragment = (FragmentRight) getFragmentManager().findFragmentByTag("left_tag");
8.Fragment 与 Activity通讯方法 1.Activity 调用 setArguments 方法

</>复制代码

  1. public class FragmentAutoCreate extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. // TODO Auto-generated method stub
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_fragment_autocreate);
  7. // 获取fragmentManager --->开启事务--->容器中填充内容--->提交事务
  8. // FragmentManager : Activity 内部用来与Fragment进行交互的接口
  9. FragmentManager fragmentManager = getFragmentManager();
  10. // 开启一个事务
  11. FragmentTransaction transaction = fragmentManager.beginTransaction();
  12. // 将左右两侧的Fragment 添加的R.id.fl_left 所代表的容器视图中
  13. FragmentLeft leftFragment = new FragmentLeft();
  14. transaction.add(R.id.fl_left, leftFragment, "left_tag");
  15. // 1. 调用 Fragment 对外提供的方法
  16. leftFragment.setMsg("tttt");
  17. FragmentRight rightFragment = new FragmentRight();
  18. // 2. Activity --setArguments-> 创值给Fragment
  19. Bundle args = new Bundle();
  20. args.putString("key", "Activity --setArguments-> 创值给Fragment ");
  21. // 传递数据
  22. rightFragment.setArguments(args);
  23. transaction.add(R.id.fl_right, rightFragment);
  24. // transaction.replace(R.id.fl_right, rightFragment);
  25. // transaction.hide(rightFragment);
  26. transaction.show(rightFragment);
  27. // 提交事务
  28. transaction.commit();
  29. }
  30. public void test() {
  31. }
  32. }
2.通过Fragment 对外提供接口方法

通过Fragment 对外提供接口方法,供Activity调用

</>复制代码

  1. public class FragmentLeft extends Fragment {
  2. private static final String TAG = " F wj";
  3. private String mMessage;
  4. public void setMsg(String msg) {
  5. this.mMessage = msg;
  6. }
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. Log.i(TAG, "----onCreate----");
  10. // 在Fragment 中调用Activity 中的方法
  11. ((FragmentAutoCreate) getActivity()).test();
  12. // TODO Auto-generated method stub
  13. super.onCreate(savedInstanceState);
  14. }
  15. @Override
  16. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  17. Bundle savedInstanceState) {
  18. Log.i(TAG, "----onCreateView----");
  19. // 将layout布局转换成View
  20. View view = inflater.inflate(R.layout.fragment_left_layout, null);
  21. Toast.makeText(getActivity(),
  22. "通过对外提供方法setMsg(String msg),供Activity 调用", 0).show();
  23. return view;
  24. }

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75847.html

相关文章

  • Preference 使用详解

    摘要:保存路径如下包名包名使用方法一般在文件夹中创建文件来对进行布局,布局文件中通常使用容器,包含多个控件,可以设置分类标题。在之前需要继承此方法不是太推荐使用,已被启用,之后更高版本,则需要继承,使用控制布局,然后实现不同控件的处理事件。 showImg(https://segmentfault.com/img/remote/1460000019975019?w=157&h=54); 极力...

    laznrbfe 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<