(一)

  • Faragment有自己的生命周期

  • Fragment依赖于Activity

  • Fragmen通过getActivity()可以获取所在Activity;Activity通过FragmentManager的findFragmentById()或findFragmentbyTag()获取Fragment

  • Fragment和Activity是多对多的关系

  1. MainActivity
  1. package com.example.fragmentdemo.UI;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4.  
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.view.View;
  8. import android.widget.Button;
  9.  
  10. import com.example.fragmentdemo.R;
  11.  
  12. public class MainActivity extends AppCompatActivity {
  13.  
  14. private Button mBtnFragment;
  15.  
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. mBtnFragment = (Button)findViewById(R.id.btn_fragment);
  21. setListeners();
  22. }
  23.  
  24. private void setListeners(){
  25. OnClick onclick = new OnClick();
  26. mBtnFragment.setOnClickListener(onclick);
  27. }
  28.  
  29. private class OnClick implements View.OnClickListener {
  30.  
  31. @Override
  32. public void onClick(View v) {
  33. Intent intent = null;
  34. switch (v.getId()){
  35. case R.id.btn_fragment:
  36. intent = new Intent(MainActivity.this,ContainerActivity.class);
  37. startActivity(intent);
  38. break;
  39. default:
  40. }
  41. }
  42. }
  43. }

ContainerActivity

  1. package com.example.fragmentdemo.UI;
  2.  
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.Button;
  6.  
  7. import androidx.appcompat.app.AppCompatActivity;
  8. import androidx.fragment.app.Fragment;
  9.  
  10. import com.example.fragmentdemo.AFragment;
  11. import com.example.fragmentdemo.BFragment;
  12. import com.example.fragmentdemo.R;
  13.  
  14. public class ContainerActivity extends AppCompatActivity {
  15.  
  16. private AFragment aFragment;
  17. private BFragment bFragment;
  18. private Button mBtnChange;
  19.  
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_container);
  24. mBtnChange = (Button)findViewById(R.id.btn_change);
  25. mBtnChange.setOnClickListener(new View.OnClickListener(){
  26.  
  27. @Override
  28. public void onClick(View v) {
  29. if (bFragment == null){
  30. bFragment = new BFragment();
  31. }
  32. getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,bFragment).commitNowAllowingStateLoss();
  33. }
  34. });
  35. // 实例化AFragment
  36. aFragment = new AFragment();
  37. // 把aFragment添加到Activity中 记得调用commitAllowingStateLoss
  38. // getSupportFragmentManager().beginTransaction().add(R.id.fl_container,aFragment).commit();
  39. // 当Fragment出现错误时,使用commit()方法会返回一些错误,而commitAllowingStateLoss()就不会
  40. getSupportFragmentManager().beginTransaction().add(R.id.fl_container,aFragment).commitAllowingStateLoss();
  41. // getSupportFragmentManager().beginTransaction().replace()替换
  42. // getSupportFragmentManager().beginTransaction().remove()移除
  43. }
  44.  
  45. }

AFragment

  1. package com.example.fragmentdemo;
  2.  
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.os.Bundle;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.TextView;
  10.  
  11. import androidx.annotation.NonNull;
  12. import androidx.annotation.Nullable;
  13. import androidx.fragment.app.Fragment;
  14.  
  15. public class AFragment extends Fragment {
  16.  
  17. private TextView mTvTitle;
  18. private Activity mActivity;
  19.  
  20. /**
  21. * 返回一个视图文件,相当于activity中的setContentView()
  22. */
  23. @Nullable
  24. @Override
  25. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  26. View view = inflater.inflate(R.layout.fragment_a,container,false);
  27. return view;
  28. }
  29.  
  30. /**
  31. * 当View创建完成之后回调该方法
  32. */
  33. @Override
  34. public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
  35. super.onViewCreated(view, savedInstanceState);
  36.  
  37. mTvTitle = view.findViewById(R.id.tv_title);
  38. }
  39.  
  40. }

BFragment

  1. package com.example.fragmentdemo;
  2.  
  3. import android.os.Bundle;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.TextView;
  8.  
  9. import androidx.annotation.NonNull;
  10. import androidx.annotation.Nullable;
  11. import androidx.fragment.app.Fragment;
  12.  
  13. public class BFragment extends Fragment {
  14.  
  15. private TextView mTvTitle;
  16.  
  17. /**
  18. * 返回一个视图文件,相当于activity中的setContentView()
  19. */
  20. @Nullable
  21. @Override
  22. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  23. View view = inflater.inflate(R.layout.fragment_b,container,false);
  24. return view;
  25. }
  26.  
  27. /**
  28. * 当View创建完成之后回调该方法
  29. */
  30. @Override
  31. public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
  32. super.onViewCreated(view, savedInstanceState);
  33.  
  34. mTvTitle = view.findViewById(R.id.tv_title);
  35. }
  36. }

(二)

  • Fragment中getActivity()为null的问题:当手机应用长期位于后台被回收后,当里面一些异步任务完成后回来getActivity时就为null

      1. package com.example.fragmentdemo;
      2.  
      3. import android.app.Activity;
      4. import android.content.Context;
      5. import android.os.Bundle;
      6. import android.view.LayoutInflater;
      7. import android.view.View;
      8. import android.view.ViewGroup;
      9. import android.widget.TextView;
      10.  
      11. import androidx.annotation.NonNull;
      12. import androidx.annotation.Nullable;
      13. import androidx.fragment.app.Fragment;
      14.  
      15. public class AFragment extends Fragment {
      16.  
      17. private TextView mTvTitle;
      18. private Activity mActivity;
      19.  
      20. /**
      21. * 返回一个视图文件,相当于activity中的setContentView()
      22. */
      23. @Nullable
      24. @Override
      25. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
      26. View view = inflater.inflate(R.layout.fragment_a,container,false);
      27. return view;
      28. }
      29.  
      30. /**
      31. * 当View创建完成之后回调该方法
      32. */
      33. @Override
      34. public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
      35. super.onViewCreated(view, savedInstanceState);
      36.  
      37. mTvTitle = view.findViewById(R.id.tv_title);
      38. if(getActivity() != null){ //判断当前activity是否为null
      39.  
      40. }else{
      41.  
      42. }
      43. }
      44.  
      45. /**
      46. * 当Fragment重建或者Fragment与Activity重新建立关系时运行这个方法
      47. * @param context
      48. */
      49. @Override
      50. public void onAttach(Context context) {
      51. super.onAttach(context);
      52. mActivity = (Activity)context;
      53. }
      54.  
      55. /**
      56. * 当activity为null时必然运行了这个方法,就是Fragment与Activity脱离关系
      57. */
      58. @Override
      59. public void onDetach() {
      60. super.onDetach();
      61. }
      62.  
      63. /**
      64. * Fragment回收
      65. */
      66. @Override
      67. public void onDestroy() {
      68. super.onDestroy();
      69. // 取消异步任务
      70. }
      71. }
  • 向Fragment传递参数

    1. //ContainerActivity:
    2.  
    3. aFragment = AFragment.newInstance("我是参数");//传递参数给Fragment
    1. //AFragment:
    2.  
    3. /**
    4. *传参
    5. */
    6. public static AFragment newInstance(String title){
    7. AFragment fragment = new AFragment();
    8. Bundle bundle = new Bundle();
    9. bundle.putString("title",title);
    10. fragment.setArguments(bundle); //将bundle传入fragment;即便fragment重构,setArguments()方法也会运用反射机制将title重新放入fragment
    11. return fragment;
    12. }
    13.  
    14. /**
    15. * 当View创建完成之后回调该方法
    16. */
    17. @Override
    18. public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    19. super.onViewCreated(view, savedInstanceState);
    20. // if(getActivity() != null){ //判断当前activity是否为null
    21. // }else{}
    22. mTvTitle = view.findViewById(R.id.tv_title);
    23. if(getArguments() != null){
    24. mTvTitle.setText(getArguments().getString("title"));
    25. }
    26. }

(三)

  • Fragment回退栈

    1. AFragment
    2.  
    3. mBtnChange = view.findViewById(R.id.btn_change);
    4. mBtnReset = view.findViewById(R.id.btn_reset);
    5. mBtnChange.setOnClickListener(new View.OnClickListener() {
    6. @Override
    7. public void onClick(View v) {
    8. if (bFragment == null) {
    9. bFragment = new BFragment();
    10. }
    11. Fragment fragment = getFragmentManager().findFragmentByTag("a");
    12. if (fragment != null) {
    13. // 隐藏aFragment,再添加bFragment
    14. getFragmentManager().beginTransaction().hide(fragment).add(R.id.fl_container, bFragment).addToBackStack(null).commit();
    15. } else {
    16. // 在commitNowAllowingStateLoss()方法之前加addToBackStack(null)将AFragment添加到回退栈里面,这样跳到BFragment再按返回键时,返回到AFragment,而不是MainActivity
    17. // replace可以理解为先remove再add,导致前一个fragment的视图没有被保存下来,虽然重新创建fragment视图了,但其视图内容也被重新创建了
    18. getFragmentManager().beginTransaction().replace(R.id.fl_container, bFragment).addToBackStack(null).commit();
    19. }
    20. }
    21. });

(四)

  • Fragment和Activity的通信

  1. 方法一:

    1. AFragment
    2.  
    3. mBtnMessage.setOnClickListener(new View.OnClickListener() {
    4. @Override
    5. public void onClick(View v) {
    6. // 通过getActivity()获得Activity,然后将其转换成ContainerActivity,调用它的setData()方法
    7. // 该方法能够向Activity传参,但不推荐
    8. ((ContainerActivity)getActivity()).setData("你好"); //方法一
    9. }
    10. });
    1. ContainerActivity
    2.  
    3. 3 public void setData(String text){
    4. mTvTitle.setText(text);
    5. }

    这个方法可行但不推荐使用

  2. 方法二:在activity中实现fagment中声明的接口,通过回调接口来实现数据的传递

    1. AFragment
    2.  
    3. /**
    4. * 接口
    5. */
    6. public interface IOnMessageClick{
    7. void onClick(String text);
    8. }
    9.  
    10. /**
    11. * 当Fragment重建或者Fragment与Activity重新建立关系时运行这个方法
    12. *
    13. * @param context
    14. */
    15. @Override
    16. public void onAttach(Context context) {
    17. super.onAttach(context);
    18. // mActivity = (Activity)context;
    19. try{
    20. listener = (IOnMessageClick) context;
    21. } catch (ClassCastException e) {
    22. throw new ClassCastException("Activity 必须实现IOnMessageClick接口");
    23. }
    24.  
    25. }
    26.  
    27. mBtnMessage.setOnClickListener(new View.OnClickListener() {
    28. @Override
    29. public void onClick(View v) {
    30. // 通过getActivity()获得Activity,然后将其转换成ContainerActivity,调用它的setData()方法
    31. // 该方法能够向Activity传参,但不推荐
    32. // ((ContainerActivity)getActivity()).setData("你好"); //方法一
    33. listener.onClick("你好");
    34. }
    35. });
    1. ContainerActivity
    2.  
    3. @Override
    4. public void onClick(String text) {
    5. mTvTitle.setText(text);
    6. }

Android_Fragment的更多相关文章

  1. Android_Fragment(碎片)知识点讲解

    今天我们来了解下Android 中的fragment(碎片)这个东西. Fragment 从英文翻译而言是碎片,片段的意思.那么这个东西是什么,在Android 中有什么用呢? 一.概念 Fragme ...

  2. Android_Fragment和Activity之间的通信

    Fragment 的生命周期是随着activity变化而变化的. 如果activity要给在运行的时候给fragment传人数据则需要fragment实现一个自定义的接口,并且实现接口里面的方法,在a ...

  3. Android_Fragment栈操作 commit()问题分析

    栈操作时遇到一个问题 getFragmentManager().beginTransaction() .replace(R.id.fl_container,bFragment) .addToBackS ...

  4. Activity与Fragment

    Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似. Fragment是用来描述一些行为或一部分用户界面在一个Activi ...

  5. Android编码学习之Fragment

    1. 什么是Fragment Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似.Fragment是用来描述一些行为或一部 ...

  6. Fragment、Activity比较——Android碎片介绍

    Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragmen ...

随机推荐

  1. 推荐几个我近期排查线上http接口偶发415时用到的工具

    导读:近期有一个业务部门的同学反馈说他负责的C工程在小概率情况下SpringMvc会返回415,通过输出的日志可以确定是SpringMvc找不到content-type这个头了,具体为什么找不到了呢? ...

  2. Python实现几种简单的排序算法

    一.冒泡排序 概念:为一个无序的列表排成有序的 实现过程描述:(升序) 1.比较相邻的元素,如果第一个比第二个大,就交换他们的位置 2.对每一对相邻元素重复1的工作,从开始第一队到最后一对,最后结束的 ...

  3. 十大排序算法JavaScript实现总结

    花费了几周的时间断断续续的练习和模仿与使用JavaScript代码实现了十大排序算法. 里面有每种算法的动图和静态图片演示,看到图片可以自己先按照图片的思路实现一下. github中正文链接,点击查看 ...

  4. Android之各个版本之间的变化

    (1)android5.0 Android5.0之后隐式打开服务需要指明包名 (2)android6.0 Android6.0之后涉及隐私的权限必须动态申请 (3)android8.0 android ...

  5. ECMAScript6 VS TypeScript

    如果你真正使用过Typescript你会发现他其实是javascript的超集, 这是一个非常简洁的描述 ,之所以称之为Typescript,正是Type一词的表述(强类型),可不仅仅是有一个Clas ...

  6. 简单自定义mybatis流程!!

    ----简单自定义mybatis流程----一.首先封装daoMapperxml文件和sqlMapconfig配置文件,如何封装:(1).封装我们的Mapper.xml文件,提取名称空间namespa ...

  7. django开发中关于外键设置

    django开发中关于外键设置 我们建模型的时候会用到ForeignKey 而由于外键的约数会导致一些保存 所有我们ctrl+左键进入源码 源码 def __init__(self, to, on_d ...

  8. PHP弱性处理0e开头md5哈希字符串缺陷/bug

    PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他 ...

  9. PHP yield代替range生成范围内的数

    <?php function yieldRange($start, $limit, $step) { if ($start == $limit || $step == 0) { return $ ...

  10. 【Java基础】谈谈集合.CopyOnWriteArrayList

    目录 实现原理 遍历时不用加锁的原因 CopyOnWriteArrayLis的缺点 使用场景 总结 参考 本篇博客介绍CopyOnWriteArrayList类,读完本博客你将会了解: 什么是COW机 ...