Android-7-Fragment
发布日期:2021-05-12 16:28:12 浏览次数:17 分类:精选文章

本文共 3965 字,大约阅读时间需要 13 分钟。

Fragment是一种可以嵌入Activity中的UI片段,与Activity非常相似,不仅包含布局,同时也具有自己的生命周期。Fragment是专门针对大屏幕移动设备而推出的。

一个Activity可以包含多个Fragment。Fragment不能独立存在,必须嵌入到Activity中使用,因此Fragment的生命周期直接受所在的Activity影响。当Activity暂停时,它拥有的所有Fragment都暂停,当Activity销毁时,它拥有的所有Fragment都被销毁。然而,当Activity运行时(在onResume()之后,onPause()之前),却可以单独地操作每个Fragment,如添加或删除Fragment等。

Fragment的生命周期与Activity的生命周期十分相似:

  • onAttach():当Fragment和Activity建立关联的时候调用。
  • onCreateView():为Fragment创建视图(加载布局)时调用。
  • onActivityCreated():当Activity的onCreate()方法返回时调用。
  • onDestroyView():当该Fragment的视图被移除时调用。
  • onDetach():当Fragment和Activity解除关联的时候调用。
  • 首先创建一个Fragment的java文件,然后它会自动创建对应的xml文件。在onCreateView()方法中调用inflate()方法返回一个View对象,inflate()方法需要传入3个参数:

  • 第1个参数表示Fragment对应的布局资源文件。
  • 第2个参数表示存放Fragment布局的ViewGroup。
  • 第3个参数是一个布尔值,表示是否在创建Fragment的布局时加到ViewGroup上。
  • 在Activity中使用Fragment时,可以通过以下方式将Fragment添加到Activity中,一种是通过布局文件添加,一种是通过代码动态添加。

    通过布局文件添加:

    这里的BlankFragment1是一个新的xml布局文件,和之前设置的一样,这里可以并排添加多个fragment,一般是一个fragment。

    在Activity中通过代码动态添加Fragment:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    //这个activity_main2的xml文件中,layout的id为rl,fragment的id为fragment0(这个先不加,用到替换的时候加上就好),
    //根据已经建过的fragment类,new一个对象
    BlankFragment1 fragment1 = new BlankFragment1();
    BlankFragment2 fragment2 = new BlankFragment2();
    //获取FragmentManager实例
    FragmentManager fm = getFragmentManager();
    //获取FragmentTransaction实例
    FragmentTransaction beginTransaction = fm.beginTransaction();
    //添加一个Fragment
    beginTransaction.add(R.id.rl, fragment1);
    //替换原来位置的fragment
    beginTransaction.replace(R.id.fragment0, fragment2);
    beginTransaction.commit();
    }

    通过FragmentTransaction对象的add()方法动态添加了Fragment,add()方法需要2个参数,第1个参数表示Fragment要放入的ViewGroup的资源id,第2个参数是要添加的Fragment。

    需要指定ViewGroup也就是Layout的id,这里还要注意Fragment的要导入的包的问题,如果导入的包不同则需要修改。

    Fragment与Activity通信可以通过以下方式实现:

  • 原生方案:Bundle,Activity发送信息给Fragment
  • protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    //原生方案:Bundle,相当与进行通信保存数据的一个类
    Bundle bundle = new Bundle();
    bundle.putString("message", "我喜欢");
    //这个activity_main2的xml文件中,layout的id为rl,fragment的id为fragment0(这个先不加,用到替换的时候加上就好),
    //根据已经建过的fragment类,new一个对象
    BlankFragment1 fragment1 = new BlankFragment1();
    BlankFragment2 fragment2 = new BlankFragment2();
    //把参数传给fragment
    fragment1.setArguments(bundle);
    }
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //在Bundle中接受信息
    Bundle bundle = this.getArguments();
    String s1 = bundle.getString("message");
    }
    1. 接口
    2. package com.example.myapplication4;
      public interface IFrangmentCallBack {
      void senMessageToActivity(String string);
      String getMsgFromActivity(String msg);
      }
      private IFrangmentCallBack fragmentCallBack;
      public void setFragmentCallback(IFrangmentCallBack callback) {
      fragmentCallBack = callback;
      }
      public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) {
      if (root == null) {
      root = inflater.inflate(R.layout.fragment_blank1, container, false);
      }
      textView = root.findViewById(R.id.tv);
      button = root.findViewById(R.id.btn);
      button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      //fragmentCallBack.senMessageToActivity("I am fragment");
      String s1 = fragmentCallBack.getMsgFromActivity(null);
      //textView.setText("Yes,I am fine");
      }
      });
      return root;
      }
      //把参数传给fragment
      fragment1.setArguments(bundle);
      fragment1.setFragmentCallback(new IFrangmentCallBack() {
      @Override
      public void senMessageToActivity(String string) {
      String s1 = string;
      }
      @Override
      public String getMsgFromActivity(String msg) {
      return "I am Activity";
      }
      });
      re(fragment1);
      1. 其他方案:eventBus,LiveData
    上一篇:Android-8-Xpage
    下一篇:Android-6-ViewPage

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月12日 11时35分32秒