
本文共 3965 字,大约阅读时间需要 13 分钟。
Fragment是一种可以嵌入Activity中的UI片段,与Activity非常相似,不仅包含布局,同时也具有自己的生命周期。Fragment是专门针对大屏幕移动设备而推出的。
一个Activity可以包含多个Fragment。Fragment不能独立存在,必须嵌入到Activity中使用,因此Fragment的生命周期直接受所在的Activity影响。当Activity暂停时,它拥有的所有Fragment都暂停,当Activity销毁时,它拥有的所有Fragment都被销毁。然而,当Activity运行时(在onResume()之后,onPause()之前),却可以单独地操作每个Fragment,如添加或删除Fragment等。
Fragment的生命周期与Activity的生命周期十分相似:
首先创建一个Fragment的java文件,然后它会自动创建对应的xml文件。在onCreateView()方法中调用inflate()方法返回一个View对象,inflate()方法需要传入3个参数:
在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通信可以通过以下方式实现:
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");}
- 接口
- 其他方案:eventBus,LiveData
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;}
//把参数传给fragmentfragment1.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);
发表评论
最新留言
关于作者
