Android-7-Fragment

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

2.一个Activity可以包含2个Fragment

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

4.Fragment的生命周期与Activity的生命周期十分相似。
(1)onAttach():当Fragment和Activity建立关联的时候调用。
(2)onCreateView():为Fragment创建视图(加载布局)时调用。
(3)onActivityCreated():当Activity的onCreate()方法返回时调用
(4)onDestroyView():当该Fragment的视图被移除时调用
(5)onDetach():当Fragment和Activity解除关联的时候调用

5.首先创建一个Fragment的java文件,然后它会自动创建对应的xml文件

(1)在onCreateView()方法中调用inflate()方法返回一个View对象,inflate()方法需要传入3个参数, 第1个参数表示Fragment对应的布局资源文件,第2个参数表示存放Fragment布局的ViewGroup,第3个参数是一个布尔值,表示是否在创建Fragment的布局时加到ViewGroup上。

public class BlankFragment1 extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    private  View root;
    private Button button;
    private TextView textView;
    @Override
    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) {
                textView.setText("Yes,I am fine");
            }
        });
        return root;
    }
}

(2)添加布局文件

在Activity中使用Fragment时,可以通过2中方式将Fragment添加到Activity中,一种是通过布局文件添加,一种是通过代码动态添加。

<1>通过布局文件添加


    
    

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

<2>在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的要导入的包的问题,如果导入的包不同则需要修改。

6.Fragment与Activity通信

(1)原生方案:Bundle,Activity发送信息给Fragment

<1>MainActivity中的代码

 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);
        re(fragment1);

    }

<2>fragment中的

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在Bundle中接受信息
        Bundle bundle=this.getArguments();
        String s1=bundle.getString("message");
    }

(2)接口

先定义一个接口类,

package com.example.myapplication4;

public interface IFrangmentCallBack {
  void senMessageToActivity(String string);
  String getMsgFromActivity(String msg);

}

然后在Fragment中使用

 private IFrangmentCallBack frangmentCallBack;
    public void setFragmentCallback(IFrangmentCallBack callback){
        frangmentCallBack=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) {
                //frangmentCallBack.senMessageToActivity("I am fragment");
                String s1=frangmentCallBack.getMsgFromActivity(null);

                //textView.setText("Yes,I am fine");

            }
        });
        return root;
    }

在MainActivity中的使用

  //把参数传给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 Actvity";
            }
        });
        re(fragment1);

 

(3)其他方案:eventBus,LiveData

7.ViewPage+fragment模拟微信滑动页面

(1)在页面中引入别的xml界面

(2)需要新建fragmentAdapter,然后对应添加多个fragment,进行切换

ViewPager中添加多个Fragment实现界面的切换

代码在这里https://download.csdn.net/download/qq_42759120/18306661

现成的用法有BottomNavigationView的用法,已经实现好了的。

你可能感兴趣的:(Android之前)