https://developer.android.google.cn/guide/components/fragments.html

一、什么是Fragment

Fragment(碎片)就是小型的Activity,它是在Android3.0时出现的。Fragment是表现Activity中UI的一个行为或者一部分。

可以把fragment想象成activity的一个模块化区域,有它自己的生命周期,接收属于它自己的输入事件,并且可以在activity运行期间添加和删除(有点像一个可以在不同的activity中重用的“子Activity”)。
Fragment必须被嵌入到一个activity中。它们的生命周期直接受其宿主activity的生命周期影响。当一个activity正在运行时,就可以独立地操作每一个Fragment,比如添加或删除它们。

Fragment可以定义自己的布局、生命周期回调方法,因此可以将fragment重用到多个activity中,因此可以根据不同的屏幕尺寸或者使用场合改变fragment组合。

二、如何创建一个Fragment

1、为Fragment定义一个布局
2、定义类继承Fragment
3、重写类中的onCreateView()方法,返回一个View对象作为当前Fragm
ent的布局。

fragment第一次绘制它的用户界面的时候,系统会调用onCreateView()方法。为了绘制fragment的UI,此方法必须返回一个作为fragment布局的根的view。如果fragment不提供UI,可以返回null。

/*** 定义类继承Fragment*/public class TitleFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {//使用打气筒填充生成一个View对象,fragment_title是一个布局的根节点View view = inflater.inflate(R.layout.fragment_title, null);return view;}}

三、如何将Fragment添加到Activity

Activity必须在清单文件中进行声明,但是Fragment不需要,Fragment只需要在Activity的布局文件中声明就可以了。

<fragment
android:id="@+id/fmt_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:name="com.itheima.fragment.TitleFragment"
/>

注意:代码中的四个属性是必须的要给的,“android:name”属性:指定了在layout中实例化的Fragment类是哪个。当系统创建这个activity
layout时,它实例化每一个在layout中指定的Fragment,并调用它们的onCreateView()方法,来获取每一个Fragment的layout,系统将从Fragment返回的View直接插入到<fragment>元素所在的地方每一个fragment都需要一个唯一的标识,如果activity重启,系统可以用来恢
复Fragment,并且可以用id来捕获Fragment来处理事务,例如移除它。
有3种方法来为一个fragment提供一个ID,具体如下所示:

  • 为android:id属性提供一个唯一ID;
  • 为android:tag属性提供一个唯一字符串;
  • 如果以上2个你都没有提供,系统将使用容器view的ID;

四、如何切换Fragment

要在activity中管理Fragment,需要使用FragmentManager可以通过调用activity的getFragmentManager()取得它的实例。
案例:点击不同的按钮切换到不同的Fragment进行显示。具体实现步骤:
1、设置布局文件:添加三个按钮用于切换Fragment,并在按钮下方
添加一个FrameLayout用来替换成响应的Fragment。
2、创建三个Fragment,SportsFragment、NewsFragment、GameFragment。

public class SportsFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {// 使用打气筒生成一个View对象View view = inflater.inflate(R.layout.fragment_sports, null);return view;}}

其余两个Fragment跟SportsFragment代码一致,只是布局文件不同。
3、添加切换Fragment的逻辑,这个是新闻频道按钮的点击事件

public void news(View view){//获取Fragment管理器对象FragmentManager manager = getFragmentManager();//开启事务FragmentTransaction transaction = manager.beginTransaction();//将FrameLayout控件替换成Fragment对象transaction.replace(R.id.frame, new NewsFragment());//提交事务transaction.commit();}

sports()方法、games()方法同上,因此不再给出代码清单。
4、运行程序,效果如下
Fragment的生命周期
Fragment的生命周期和activity生命周期很像,其生命周期方法如下所示。

  • onAttach:绑定到activity
  • onCreate:创建fragment
  • onCreateView: 创建fragment的布局
  • onActivityCreated: activity创建完成后
  • onStart: 可见, 不可交互
  • onResume: 可见, 可交互
  • onPause: 部分可见, 不可交互
  • onStop:不可见
  • onDestroyView: 销毁fragment的view对象
  • onDestroy: fragment销毁了
  • onDetach: 从activity解绑了

五、Fragment的向下兼容

Fragment是在Android3.0才推出的,若想在3.0的低版本下使用Fragment,则需要执行下面2步:
1、把所有Fragment和FragmentManager改成support-v4包下的类
2、把Activity的继承改为FragmentActivity(support-v4包下的)

六、Fragment之间的通信案例

案例:创建一个用于显示选项卡的Fragment和一个用于显示内容的Fragment,当选项卡切换时,使内容的Fragment信息跟着一起切换。具体实现步骤如下所示:
1、先创建选项卡Fragment和内容Fragment,并在activity_main.xml布
局文件中进行设置,其布局效果如下:
2、为选项卡Fragment创建布局文件,其布局效果如下:
3、添加内容区域Fragment的代码逻辑

public class ContentFragment extends Fragment {private TextView  tv_title;//标题private ImageView iv_pic;//内容@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroupcontainer, Bundle savedInstanceState) {//使用打气筒填充布局View view = inflater.inflate(R.layout.fragment_content, null);//获取布局中的控件tv_title = (TextView)view.findViewById(R.id.tv_title);iv_pic = (ImageView) view.findViewById(R.id.iv_pic);return view;}//定义一个方法,用于改变标题和图片public void setTitleAndImage(String title, int picId) {tv_title.setText(title);iv_pic.setImageResource(picId);}}

4、添加选项卡区域Fragment的代码逻辑

public class TabFragment extends Fragment implements OnItemClickListener {private String[] datas;private int[]    picIds;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroupcontainer, Bundle savedInstanceState) {//直接使用ListView作为布局,因此不需要布局文件ListView listView = new ListView(getActivity());//定义一些常量数据作为册数数据datas = new String[]{"新闻", "体育", "财经", "社会", "娱乐", "国际"};picIds = new int[]{R.drawable.a0, R.drawable.a1, R.drawable.a2, R.drawable.a3, R.d rawable.a4, R.drawable.a5};//设置点击事件listView.setOnItemClickListener(this);//声明一个ArrayAdapter对象ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_expandable_list_item_1, datas);//给ListView设置AdapterlistView.setAdapter(adapter);//返回视图return listView;}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//获取当前的title和图片idString title = datas[position];int picId = picIds[position];//获取Fragment管理器FragmentManager manager = getFragmentManager();//通过ID选择出ContentFragment对象ContentFragment fragment = (ContentFragment) manager.findFragmentById(R.id.fragment_content);//调用ContentFragment的方法,给ContentFragment传递参数,实现不同Fragment直接的通信fragment.setTitleAndImage(title, picId);}}

Fragment与Activity如何交互?

这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持
久化,application全局变量,收发广播等等。
首先我们来介绍使用Handler来实现Fragment与Activity
的交互。第一步,我们需要在Activity中定义一个方法用来设置Handler对象。
public void setHandler(Handler handler) {
mHandler = handler;
}
第二步,在Fragment中的回调函数onAttach()中得到Fragment所在Activity,并调用setHandler方法,设置Handler。该Handler在Fragment中定义,用来接收消息与Fragment进行交互。

@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);mActivity = (MainActivity) activity;mActivity.setHandler(mHandler);}public Handler mHandler = new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case 1:text.setText((String) msg.obj);break;}};};

然后我们可以在Activity中发送消息给Fragment中的Hanlder进行交互。

public void inter(View view) {
Message msg = new Message();
msg.obj = edit.getText().toString();
msg.what = 1;
mHandler.sendMessage(msg);
}

Fragment回退栈实现

public class MainActivity extends FragmentActivity implements OnClickListener {private FragmentA fragmentA;private FragmentB fragmentB;private FragmentC fragmentC;private List<Fragment> fragmentsList = new ArrayList<Fragment>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.btnA).setOnClickListener(this);findViewById(R.id.btnB).setOnClickListener(this);findViewById(R.id.btnC).setOnClickListener(this);fragmentA = new FragmentA();fragmentB = new FragmentB();fragmentC = new FragmentC();//将三个Fragment添加到帧布局中/** 1. 获取FragmentManger*/FragmentManager fragmentManager = getSupportFragmentManager();/** 2. 通过FragmentManager获取到事务管理器*/FragmentTransaction transaction = fragmentManager.beginTransaction();/** 3. 将Fragment添加到帧布局中*/transaction.add(R.id.fl, fragmentA, "FragmentA").add(R.id.fl, fragmentB,"FragmentB").add(R.id.fl, fragmentC,"FragmentC").hide(fragmentB).hide(fragmentC).commit();addToBackStack(fragmentA);}private void addToBackStack(Fragment fragment) {if (fragmentsList.contains(fragment)) {//先将老的对象移除fragmentsList.remove(fragment);//将Fragment添加到集合的最后fragmentsList.add(fragment);}else {fragmentsList.add(fragment);}}@Overridepublic void onBackPressed() {
//      super.onBackPressed();if (fragmentsList.size()>1) {//移除最顶端的FragmentfragmentsList.remove(fragmentsList.size()-1);//将下一个Fragment给显示出来showFragment(fragmentsList.get(fragmentsList.size()-1));}else {//如果当前栈中没有Fragment或者只有一个Fragment,直接退出Activityfinish();}}private void showFragment(Fragment fragment) {FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.hide(fragmentA).hide(fragmentB).hide(fragmentC).show(fragment).commit();}@Overridepublic void onClick(View v) {FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.hide(fragmentA).hide(fragmentB).hide(fragmentC);switch (v.getId()) {case R.id.btnA:transaction.show(fragmentA);addToBackStack(fragmentA);break;case R.id.btnB:transaction.show(fragmentB);addToBackStack(fragmentB);break;case R.id.btnC:transaction.show(fragmentC);addToBackStack(fragmentC);break;default:break;}//把当前事务添加到会退栈中
//      transaction.addToBackStack(null);transaction.commit();}}

碎片Fragment相关推荐

  1. android碎片按钮,Android 碎片(Fragment)

    Android 碎片(Fragment) 碎片是活动的一部分,使得活动更加的模块化设计.我们可以认为碎片是一种子活动. 下面是关于碎片的重要知识点 - 碎片拥有自己的布局,自己的行为及自己的生命周期回 ...

  2. android使碎片切换界面,玩转Android中的碎片Fragment

    引言:在Android开发中,我们都知道一些界面的展示经常会用到的就是Activity,但是Activity存在着很大的局限性,比如说手机上的界面显示在平板上面就会发生各种变形的问题,Activity ...

  3. Android 碎片fragment使用详解

    作为一名专业的android开发人员,需要我们能够同时做到兼顾平板和手机.下面的内容会对你有一定帮助 目录 1.碎片介绍 2.碎片的基本使用 3.动态添加碎片 4.在碎片中模拟返回栈 5. 碎片和活动 ...

  4. 老式Android中碎片Fragment之间的跳转和数据传递

    随着jetpack组件的使用,fragment之间的跳转和传值已经有相应的demo了.但是有时候难免不用Navigation,或者一些老项目的维护.这里,简单记录下老式fragment怎么跳转和传值. ...

  5. 《第一行代码》学习笔记16-碎片Fragment(1)

    1.碎片( Fragment):一种可以嵌入在活动当中的UI片段,能让程序更加合理和充分地利用大屏幕的空间,在平板上的应用广泛. 2.碎片同样包括布局,有自己的生命周期,甚至可理解成一个迷你型的活动. ...

  6. 安卓碎片(Fragment)的使用

    碎片是什么 碎片(Fragment)是一种可以嵌入在活动中的UI片段,它能让程序更加合理和充分的利用大屏幕,非常重要的是碎片还可以动态加载,可以让我们在一个活动中很方便的去切换展示的内容,这可以提高用 ...

  7. Android碎片Fragment详讲(1)

    Fragment Fragment创建的步骤 1.        继承fragment一定是V4包下的 2.        有且只有一个无参的构造方法 3.        如果Fragment需要显示 ...

  8. android fragment 菜单栏,android UI:底部菜单栏的学习与制作——Fragment碎片一

    碎片(Fragment) 嵌入与活动中的UI片段,为了合理的分配布局而存在,这是我的简单理解.多用于兼顾手机与平板的UI,也适用于灵活高级的UI制作. Demo 简单的按键切换两片不同的Demo 新建 ...

  9. Android入门(10)| Fragment碎片详解

    文章目录 为什么要使用碎片(Fragment) 实例 布局文件 Fragment Activity 动态添加碎片 布局文件 Fragment Activity 碎片通信 Fragment 布局文件 A ...

最新文章

  1. 模板 - 欧拉路、欧拉回路(一笔画问题)
  2. pandas使用pad函数向dataframe特定数据列的每个字符串添加前置(前缀)补齐字符或者字符串、向所有字符串的左侧填充、直到宽度达到指定要求(left padding)
  3. python基础语法有哪些-Python基础语法知识有哪些?
  4. 搭建SSH框架之一(资料准备)
  5. Linux下利用rsync实现网站镜像同步
  6. python bottle web框架上传静态文件与加载静态文件
  7. Discrete Logging hunnu10590 pku2417 fzu 1352 hit 1928 zoj 1898
  8. java cmd停服务_java代码启动cmd执行命令来开启服务出现无法连接的问题
  9. 从零开始学java 框架_从零开始学 Java - 搭建 Spring MVC 框架
  10. 条款三 : 操作符is或as优于强制转型
  11. 神奇的Gamma函数(scipy)
  12. 解决mysql中文乱码问题。
  13. 字符串转json(JSON.parse报错)
  14. 垃圾分类催生创业公司
  15. 2019年下半年教师资格幼儿园《综合素质》真题与参考答案
  16. mysql 后缀 deleted,MySQL · 特性分析 · (deleted) 临时空间
  17. 夜雨数竞笔记-极限(11)-欧拉常数
  18. 文通科技OCR识别|电子护照阅读器
  19. 微信小程序,高德地图
  20. 广域网接口是不是wan_什么是WAN(广域网)?

热门文章

  1. MOSS推荐之1-WSS V3服务器架构
  2. 分段路由:一个新的SDN内部技术—Vecloud
  3. Greenplum failed segment的恢复方法
  4. [ Python ] PIL
  5. java个人学习笔记:javaBean
  6. *[hackerrank]Maximizing XOR
  7. 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
  8. 寻找数组中的重复数字(java,可执行程序)
  9. MySQL 唯一索引和普通索引该如何选择?
  10. linux运行windows环境变量,使用环境变量识别Cygwin,Linux,Windows