Fragment

来源:互联网 发布:navicat怎么连接mysql 编辑:程序博客网 时间:2024/05/02 00:12

作用:

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;@Overridepublic 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(){@Overridepublic 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。

以后有时间,咱们可以继续聊一聊。
1 0
原创粉丝点击