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的用法,已经实现好了的。