博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fragment
阅读量:4291 次
发布时间:2019-05-27

本文共 3037 字,大约阅读时间需要 10 分钟。

作用:

Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的。难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊。Fragment的出现就是为了解决这样的问题。你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。

历史:

Android是在Android 3.0 (API level 11)开始引入Fragment的。

例子一:

不扯淡了,直接上例子,这才有感性认识。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <fragment
        android:id="@+id/id_fragment_title"
        android:name="com.zhy.zhy_fragments.TitleFragment"
        android:layout_width="fill_parent"
        android:layout_height="45dp" />
    <fragment
        android:layout_below="@id/id_fragment_title"
        android:id="@+id/id_fragment_content"
        android:name="com.zhy.zhy_fragments.ContentFragment"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</RelativeLayout>

这个是主布局。。里面的两个fragment,其实就是name引用两个Fragment类的实例。。类似于:

public class TitleFragment extends Fragment{	private ImageButton mLeftMenu;	@Override	public View onCreateView(LayoutInflater inflater, ViewGroup container,			Bundle savedInstanceState)	{		View view = inflater.inflate(R.layout.fragment_title, container, false);		mLeftMenu = (ImageButton) view.findViewById(R.id.id_title_left_btn);		mLeftMenu.setOnClickListener(new OnClickListener()		{			@Override			public void onClick(View v)			{				Toast.makeText(getActivity(),						"i am an ImageButton in TitleFragment ! ",						Toast.LENGTH_SHORT).show();			}		});		return view;	}}
这个Fragment里面,其实也是布局了一个layout的,因为是用Fragment,这个主布局中的小布局,有了自己的布局事件,有了生命周期,等等。从这个可以看出,Fragment创建的布局就像是Activity的小弟。这个fragment,是专来布局Fragment的专用标签。两个名字只是为了好识别。谁让布局文件的默认首字母都是小写的。还有,要说的是,FrameLayout是布局标签,fragment是控件标签,这两个只是字母有点象,别的半毛钱关系没有。

例子二:

上面的fragment是用已经写好的Fragment实例,来进行主文件的布局。实际上,我们可以只设置一个id属性。这个时候我们就可以动态的根据响应,来设置fragment里面的布局。方法就是:1.利用getFragmentManager来获取FragentManager。(这里多说一点,如果大家用FragmentActivity,那就要用getSupportFragmentManager来获取)。
2.利用Fragment,begin 一个Transaction 。3.利用FragmentTransaction来replace掉,参数一个是主布局中的fragment的idInt,一个是实例化的Fragment实例,这个在上面的例子已经实例化一个了。4.这个时候,布局已经完成了。我们只需要在主文件的Activity中来获取控件,绑定事件就行了。根据Activity和Fragment的生命周期,在我们replace的Fragment布局中,控件的事件可以直接在这个Fragment中编写,但是影响的,只是这个Fragment,如果用主布局的Context或者系统管理器,那干什么事都行。

例子三:

下面,有些问题了。1.如果我们fragemt中布局一个fragment,那么层层替换,进入后,我们再点击back,会回到哪里呢?
2.下面,要讨论一个非常重要的问题。先引入一下,我们在qq好友列表里面,找到好友,然后点击,看到好友资料,然后我们点击发信息,这个时候,我们进入聊天对话这样交互界面,下面注意的是,这个时候我们如果点击back,我们会返回到哪里?不错,我们回到了对话列表这个界面。请问,这怎么做到?简单的思路(更好的方法,欢迎评论,我会重新编辑加进来):方法一:我们可以用fragment的替换,这个时候,我们基本上可以不停的整个replace,缺点是:这个Activity的栈会加长。方法二:我们可以用startActivty,然后设置一个带有flags的Intent,传递,打开。这样的好一些。个人觉着,这两个方法都不是特别好。
3.下面,我们聊一个非常重要的话题。

复杂布局中的控件通信

首先,看一下多个fragment布局下的。
方法一:这个就不用说了,肯定是在主布局中声明一个public的简单数据类型或者复杂的数据类结构,这样,就可以共享数据了。方法二:我们可能在需要Fragment实例对象的时候,才去实例化,然后这个实例化的对象的访问空间别的特别小,下一次用别的替换的时候,估计这个历经销毁了,没销毁也用不了了。。这个思路就是利用实例对象,getFragmentManager.findFragmentByTag()或者findFragmentById(),这样就可以找到这个Fragment。
以后有时间,咱们可以继续聊一聊。
你可能感兴趣的文章
API网关在微服务架构中的应用,这一篇就够了
查看>>
JVM发生内存溢出的8种原因、及解决办法
查看>>
SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作
查看>>
高性能负载均衡:nginx搭建tomcat集群
查看>>
Spring切面中的正则表达式
查看>>
一直再说高并发,多少QPS才算高并发?
查看>>
Git恢复之前版本的两种方法reset、revert(图文详解)
查看>>
Maven打包的三种方式
查看>>
电商场景:并发扣库存,怎么保证不超卖又不影响并发性能
查看>>
分布式事务处理方式总结
查看>>
延迟队列有哪些实现方案?说说你的看法
查看>>
厉害了!我们老大半小时把我的springboot项目并发提升几倍
查看>>
Spring 中Bean 的生命周期
查看>>
为什么要用枚举实现单例模式(避免反射、序列化问题)
查看>>
微服务架构下的分布式限流方案思考
查看>>
全网最详细的一篇SpringCloud总结
查看>>
消息中间件中的有序消息,其实是排队但是不能插队
查看>>
mysql为什么使用B+树作为索引的结构
查看>>
mysql索引总结(1)-mysql 索引类型以及创建(文章写的不错!!!)
查看>>
聊聊CAS - 面试官最喜欢问的并发编程专题
查看>>