一、Fragment简介

  • 碎片是一种可以嵌在Activity中的UI片段,是一个小型的Activity,又称Activity片段。
  • Fragment并不能单独使用,需要嵌套在Activity中使用。尽管它拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响。

二、创建一个Fragment

1.静态加载Fragment

(1)创建Fragment布局文件
left_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="Button"/>
</LinearLayout>

right_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#B9D6E3"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textSize="25sp"android:text="This is right Fragment"/>
</LinearLayout>

(2)自定义一个Fragment类,继承Fragment或者他的子类,重写onCreateView()方法 在该方法中调用:inflater.inflate()方法加载Fragment的布局文件,接着返回加载的view对象

public class LeftFragment extends Fragment {@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {//加载布局View view = inflater.inflate(R.layout.left_fragment, container, false);return view;}
}
public class RightFragment extends Fragment {@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.right_fragment,container,false);return view;}
}

inflate(int resource, @Nullable ViewGroup root, boolean attachToRoot) :加载布局文件

  • 第一个参数:要加载的布局文件
  • 第二个参数:第一个参数的父布局
  • 第三个参数
    (1)true:表示将第一个参数表示的布局添加到第二个参数的布局中
    (2)false:不把第一个参数的布局添加到第二个参数的布局中

(3)在需要加载Fragment的Activity对应的布局文件中添加fragment的标签
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/left_frag"android:name="com.example.fragmenttest.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><fragmentandroid:id="@+id/right_frag"android:name="com.example.fragmenttest.RightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/>
</LinearLayout>

<fragment>:在布局中添加碎片
android:name:要添加的碎片的类名,该类名为全限定类名

(4)Activity在onCreate( )方法中调用setContentView()加载布局文件即可
MainActivity.java文件不修改

2.动态加载Fragment

(1)创建Fragment布局文件
left_fragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#E696B1"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textSize="40sp"android:layout_marginLeft="20dp"android:textColor="#000000"android:text="这是本地视频"/>
</LinearLayout>

right_fragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#B9D6E3"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textSize="40sp"android:layout_marginLeft="20dp"android:textColor="#000000"android:text="这是网络视频"/>
</LinearLayout>

(2)自定义一个Fragment类,继承Fragment或者他的子类,重写onCreateView()方法 在该方法中调用:inflater.inflate()方法加载Fragment的布局文件,接着返回加载的view对象
代码同静态加载
(3)activity.main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/menu1"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:text="本地视频"android:gravity="center"android:textSize="30sp"/><TextViewandroid:id="@+id/menu2"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:text="网络视频"android:gravity="center"android:textSize="30sp"/></LinearLayout><FrameLayoutandroid:id="@+id/content"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="8"/>
</LinearLayout>

(4)MainActivity
获得FragementManager对象——>开启事务,获得FragmentTransaction对象
——>调用replace()方法添加碎片到容器——>提交事务

public class MainActivity extends AppCompatActivity implements View.OnClickListener{private TextView menu1;private TextView menu2;private FrameLayout content;private FragmentManager fragmentManager;private FragmentTransaction transaction;private Fragment fragment1;private Fragment fragment2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();//获得FragmentManager对象fragmentManager = getSupportFragmentManager();//开启事务,获得FragmentTransaction对象transaction = fragmentManager.beginTransaction();//创建需要添加的Fragmentfragment1 = new LeftFragment();fragment2 = new RightFragment();//向容器内添加或替换碎片,默认情况下为LeftFragmenttransaction.replace(R.id.content,fragment1);//提交事务transaction.commit();}//初始化控件private void initView() {menu1 = (TextView)findViewById(R.id.menu1);menu2 = (TextView)findViewById(R.id.menu2);content = (FrameLayout) findViewById(R.id.content);menu1.setOnClickListener(this);menu2.setOnClickListener(this);}@Overridepublic void onClick(View view) {transaction = fragmentManager.beginTransaction();switch (view.getId()){case R.id.menu1://点击menu1,内容替换为leftFragmenttransaction.replace(R.id.content,fragment1);break;case R.id.menu2://点击menu1,内容替换为RightFragmenttransaction.replace(R.id.content,fragment2);break;default:break;}transaction.commit();}
}

注意:

FragmentTransaction只能使用一次,每次使用都要调用FragmentManager
的beginTransaction()方法获得FragmentTransaction事务对象

方法详解:
getSupportFragmentManager():获得FragmentManager
beginTransaction():开启事务,获得FragmentTransaction对象
replace(int containerViewId, Fragment fragment):向容器内添加碎片
commit():提交事务

  • 第一个参数:要添加Fragment的容器
  • 第二个参数:添加的Fragment实例

运行样式:
通过点击不同TextView得到不同Fragment
点击本地视频:

点击网络视频:

三、碎片和活动之间进行通信

1.组件获取

(1)Fragment获取Activity中的组件:
通过getActivity()方法得到和当前碎片相关联的活动。再通过findViewById()获取Activity中相应组件
getActivity().findViewById(R.id.list)

碎片中使用Context对象,可通过getActivity()方法获取

(2)Activity获取Fragment中的组件:
通过getFragmentManager()方法得到FragmentManager。调用FragmentManager的findFragmentById()方法得到碎片的实例
getFragmentManager().findFragmentById(R.id.right_fragment)

2.数据传递

(1)Activity传递数据给Fragment
在上一个例子的基础上修改代码:
right_fragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="#B9D6E3"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginLeft="20dp"android:textSize="40sp"android:textColor="#000000"android:text="这是网络视频" /><TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="10dp"android:textSize="30sp"/><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button"android:layout_marginTop="10dp"android:layout_gravity="center"/>
</LinearLayout>

修改MainActivity代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{...@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();...transaction.replace(R.id.content,fragment1);//创建Bundle对象Bundle bundle = new Bundle();//向Bundle对象中添加数据bundle.putString("message","视频加载中....");//把数据设置到Fragment中fragment2.setArguments(bundle);transaction.replace(R.id.content,fragment1);//提交事务transaction.commit();}//初始化控件private void initView() {...}@Overridepublic void onClick(View view) {...
}

修改RightFragment代码如下:

public class RightFragment extends Fragment {private Button button;private TextView text;private Bundle bundle;private String message;@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.right_fragment,container,false);button = view.findViewById(R.id.button1);text = view.findViewById(R.id.text);//获取从Activity传来的数据bundle = this.getArguments();//获取某一值message = bundle.getString("message");button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//显示传递过来的值text.setText(message);}});return view;}
}

方法详解:
setArguments(Bundle args):用于传递参数到Fragment,要传递的参数存放到Bundle对象中。
getArguments():获取Activity中传来的数据。返回值为Bundle对象。

运行样式:
没点击按钮之前网络视频页面:

点击按钮接收Activity传来的消息,网络视频页面:

(2)Fragment传递数据给Activity

(1)编写布局文件
my_fragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#E696B1"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginLeft="20dp"android:textColor="#000000"android:text="这是Fragment"android:textSize="40sp"/>
</LinearLayout>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textSize="30sp"android:textColor="#000000"/><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="Button"/><FrameLayoutandroid:id="@+id/content"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="8"/>
</LinearLayout>

(2)设置回调接口,该接口用于用于Activity与Fragment通信

/*回调接口,用于Fragment和Activity之间通信*/
public interface ICallBack {void getMessage(String message);
}

(3)自定义Fragment,设置接口回调方法

public class MyFragment extends Fragment {@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {//加载布局View view = inflater.inflate(R.layout.left_fragment, container, false);return view;}//设置接口回调方法public void sendMessage(ICallBack callBack){callBack.getMessage("来自Fragment的消息");}
}

(4)MainActivity中调用接口回调方法

public class MainActivity extends AppCompatActivity {private TextView text;private Button button;private FragmentManager fragmentManager;private FragmentTransaction transaction;private MyFragment fragment;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();fragmentManager = getSupportFragmentManager();transaction = fragmentManager.beginTransaction();fragment = new MyFragment();transaction.replace(R.id.content, fragment);transaction.commit();}private void initView() {text = (TextView) findViewById(R.id.text);button = (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 通过接口回调将消息从fragment发送到Activityfragment.sendMessage(new ICallBack() {@Overridepublic void getMessage(String message) {text.setText(message);}});}});}
}

(3)Fragment和Fragment直接互相传递数据

FragmentManager fManager = getSupportFragmentManager( );
FragmentTransaction fTransaction = fManager.beginTransaction();
Fragmentone t1 = new Fragmentone();
Fragmenttwo t2 = new Fragmenttwo();
Bundle bundle = new Bundle();
bundle.putString("key",id);
t2.setArguments(bundle);
fTransaction.add(R.id.content, t2);
fTransaction.addToBackStack(t1);
fTransaction.commit();

addToBackStack(String name):添加一个事务到返回栈

四、碎片的生命周期

1.碎片的四种状态

(1)运行状态:
当一个碎片是可见的,且它关联的活动处于运行状态时,该碎片也处于运行状态
(2)暂停状态:
一个活动进入暂停状态,与它相关联的碎片就会进入暂停状态
(3)停止状态:

  • 一个活动进入停止状态,与它相关联的碎片就会进入到停止状态
  • 调用FragmentTransaction的remove()、replace()移除或替换活动中的碎片,且在事务提交之前调用addToBackStack()方法,碎片会进入停止状态

(4)销毁状态:

  • 活动被销毁,与它相关联的碎片进行销毁状态
  • 调用FragmentTransaction的remove()、replace()移除或替换活动中的碎片,碎片进入销毁状态。

2.碎片的生命周期


onAttach():Fragment被添加到Activity中会调用
onCreateView():当Fragment创建视图(加载布局)时调用
onActivityCreated():Fragment关联的Activity创建完毕时调用
onDestoryView():与碎片关联的视图被移除的时候调用
onDetach():当碎片与活动解除关联关系的时候调用

实例:
点击LeftFragment界面的Button按钮,RightFragment被替换为AnotherRightFragment,观察整个过程中RightFragment的生命周期:
重要代码:
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/left_content"android:name="com.example.fragmenttest.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><FrameLayoutandroid:id="@+id/right_content"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/>
</LinearLayout>

RightFragment.java

public class RightFragment extends Fragment {public static final String TAG = "RightFragment";@Overridepublic void onAttach(@NonNull Context context) {super.onAttach(context);Log.d(TAG,"onAttach");}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG,"onCreate");}@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {Log.d(TAG,"onCreateView");View view = inflater.inflate(R.layout.right_fragment,container,false);return view;}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);Log.d(TAG,"onActivityCreated");}@Overridepublic void onStart() {super.onStart();Log.d(TAG,"onStart");}@Overridepublic void onResume() {super.onResume();Log.d(TAG,"onResume");}@Overridepublic void onPause() {super.onPause();Log.d(TAG,"onPause");}@Overridepublic void onStop() {super.onStop();Log.d(TAG,"onStop");}@Overridepublic void onDestroyView() {super.onDestroyView();Log.d(TAG,"onDestoryView");}@Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG,"onDestory");}@Overridepublic void onDetach() {super.onDetach();Log.d(TAG,"onDetach");}
}

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener{private FragmentManager fragmentManager;private FragmentTransaction transaction;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = (Button) findViewById(R.id.button);button.setOnClickListener(this);replaceFragment(new RightFragment());}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.button:replaceFragment(new AnotherRightFragment());break;default:break;}}public void replaceFragment(Fragment fragment){fragmentManager = getSupportFragmentManager();transaction = fragmentManager.beginTransaction();transaction.replace(R.id.right_content, fragment);transaction.commit();}
}

打印结果:
(1)RightFragment第一次被加载,依次执行:
onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()
(2)点击Button按钮,AnotherRightFragment替换了RightFragment。RightFragment被销毁,依次执行:
onPause()、onStop()、onDestoryView()、onDestory()、onDetch()
(3)按下Back键,RightFragment会重新回到屏幕,依次执行;
onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()
(4)再按Back键会退出程序,依次执行:
onPause()、onStop()、onDestoryView()、onDestory()、onDetch()

如果息屏:执行onPause()、onStop()方法;
再摁亮屏幕:执行onStart()、pnResume()方法

修改MainActivity.java的代码如下:

 public void replaceFragment(Fragment fragment){fragmentManager = getSupportFragmentManager();transaction = fragmentManager.beginTransaction();transaction.replace(R.id.right_content, fragment);//将事务添加到返回栈中transaction.addToBackStack(null);transaction.commit();}

打印结果:
(1)RightFragment第一次被加载,依次执行
onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()
(2)点击Button按钮,AnotherRightFragment替换了RightFragment。RightFragment进入停止状态,依次执行
onPause()、onStop()、onDestoryView()
(3)按下Back键,RightFragment会重新回到屏幕,依次执行;
onCreateView()、onActivityCreated()、onStart()、onResume()

因为RightFragment没有被销毁,只是进入停止状态了。所以重新回到运行状态不会执行onCreate()

(4)再按Back键,RightFragment界面消失,依次执行
onPause()、onStop()、onDestoryView()、onDestory()、onDetch()
(5)再按Back,退出程序
不执行什么方法了

Fragment的基本用法相关推荐

  1. Android开发之fragment之replace用法

    我们先来写个接口: package com.xiayiye.yhsh.fragmentreplace;import android.os.Bundle;/*** @author :下一页5(轻飞扬)* ...

  2. 有关文档碎片(document fragment)的用法

    通常情况下修改.删除或者增加DOM元素.更新DOM会导致浏览器重新绘制屏幕,也会导 致reflow,这样会带来巨大的开销.我们通常解决这的办法尽量减少更新DOM,这也就意 味着将DOM的改变分批处理, ...

  3. Android Fragment 解析(下)

    本篇将介绍上篇博客提到的:如何管理Fragment回退栈,Fragment如何与Activity交互,Fragment与Activity交互的最佳实践,没有视图的Fragment的用处,使用Fragm ...

  4. 【转】 Android Fragment 真正的完全解析(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...

  5. Android Fragment 真正的完全解析(下)

    本篇将介绍上篇博客提到的:如何管理Fragment回退栈,Fragment如何与Activity交互,Fragment与Activity交互的最佳实践,没有视图的Fragment的用处,使用Fragm ...

  6. Fragment专辑(一):Fragment简介

    Fragment是android中非常常用的控件之一,他可以帮助开发者实现类似于局部刷新的功能,这样与用户的交互更加简单,一个界面可以展示更多更丰富的内容,而且局部刷新可以节省刷新界面的时间和内存消耗 ...

  7. Fragment专辑(三):Fragment的添加(add)和替换(replace)的不同

    所有的文章都是自己的经验和总结,如果有错误的地方欢迎留言指正,以免影响其他的少年. 上一篇有提到一个知识点: transaction.commit(); transaction.commitAllow ...

  8. Fragment Summary 2/2

    出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API ...

  9. 实现Fragment的切换和ViewPager自动循环设置切换时间

    1.FragmentActivity与Fragment之间的用法 2.实现ViewPager自动轮换,设置移动的时间 通过反射获取mScrooler这个对象: Field mScroller;mScr ...

最新文章

  1. GA(遗传算法)的Matlab程序原理(from:六分之一工作室)
  2. Python实现线程池
  3. 坐标系转换公式_【技术】西安80坐标与地方坐标系的转换方法技巧
  4. [转] UML类图的几种关系总结
  5. 数据结构(七)---循环队列的实现---java版
  6. 【POJ - 3352】Road Construction(Tarjan,边双连通分量)
  7. js中加载指定的html代码,在js或JQuery中怎样判断页面html代码中含有指定名称的div元素...
  8. KMP字符串比对算法理解
  9. 数字化转型下的银行云单元架构
  10. mac 上压测工具_Mac上的触控板/鼠标增强工具推荐
  11. MySQL Miscellaneous Functions(ip uuid方法)
  12. 复化辛普森公式求二重积分matlab源码及例题
  13. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_19-页面查询服务端开发-创建CMS服务工程-CMS工程结构...
  14. 【数字基带信号】基于matlab三阶高密度双极型码【含Matlab源码 990期】
  15. 2021年长安杯电子数据取证比赛复盘完整版(wp)
  16. RBF神经网络和拟合实例
  17. MySql数据库级别MD5加密java MD5加密解密工具包
  18. 手绘风格的原型图制作工具
  19. AndroidQ 分屏窗口尺寸计算 (WMS部分)
  20. html自动验证邮件地址格式,JavaScript表单验证和邮箱格式验证的方法

热门文章

  1. Docker网络模式解析
  2. Object,byte[],ByteBuffer之间的转换。
  3. 开发规范-java代码注释及IDEA配置代码注释模板
  4. 【不同的子序列II】
  5. 在一个老外微信PM的眼中,中国移动App UI那些事儿
  6. linux dpdk,在Linux(CentOS)上部署DPDK------命令行方式
  7. python 最简单的画图
  8. java使用ini4j读写和修改ini配置文件(支持section)
  9. 大数据学习系列(九)Hadoop1.X痛点分析及Hadoop2.X提出的解决方案
  10. 系统设置了静态IP之后还会获取动态IP的问题解决