Fragment整理

东西主要是整合了几个大婶子之作

fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。可以看做是一个子Activity

创建一个Fragment和创建一个Activity很类似,继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局。例子:

 

  

Fragment的生命周期方法依赖于Activity的生命周期,例如一个ActivityonPause()的生命周期方法被调用的时候这个Activity中的所有的FragmentonPause()方法也将被调用。

 

使用XML添加FragmentActivity

尽管Fragment可以被多个Activity重用,但是您也必须把Fragment关联到一个FragmentActivity上。可以使用XML布局文件的方式来实现这种关联。

说明:上面的所说的FragmentActivity适用在API3.0以下的版本,3.0及以上的版本可以使用普通的Activity

例子:

  

上面使用fragment标签,android:name=””指定一个添加到xml中的Fragment。对于创建不同的屏幕尺寸布局的更多信息,请阅读支持不同的屏幕尺寸。

 

 

  

当您添加一个片段一个活动布局定义的布局XML文件中的片段,你不能删除在运行时的片段。如果您打算在用户交互和交换片段,你必须添加的活性片段的活动时第一次启动。

 

、构建一个灵活的UI

 

FragmentManager提供了对Activity运行时的Fragment的添加、删除、替换的操作。

 

Activity运行期间你可以添加Fragment而不是在XML布局文件中进行定义。如果你打算在Activity中改变Fragment的生命过程。

 

如果要执行添加、删除、修改的操作,你必须通过FragmentManager的对象获得一个FragmentTransaction对象,通过它的API来执行这些操作。

 

添加一个Fragment到一个Activity,必须把这个Fragment添加到一个容器视图中。例子:

 

Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。

一个FragmentTransaction对象可以执行多个增删修的方法,如果你想把这些修改提交到Activity上,必须在最后调用一下这个对象的commit()方法。例子:

 

  

由于不是定义在XML布局中的,所有可以转型删除和修改的操作。

如果替换或者删除一个Fragment然后让用户可以导航到上一个Fragment,你必须在调用commit()方法之前调用addToBackStack()方法添加到回退栈。如果你把这个Fragment添加到了回退栈,在提交之后这个Fragment是会被Stop而不是Destroyed。如果用户导航到这个Fragment,这个Fragment会被Restart而不是重新创建。如果你没有把它添加到回退栈,则在删除或者替换的时候它将被Destroyed。例子:

  

4、与其他Fragment的交互

两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。

为了实现两个Fragment的交互,您可以在Fragment中定义一个接口,然后再这个接口中定义一个方法,在FragmentonAttach()方法中调用这个接口中的方法。然后让Activity实现这个方法来完成ActivityFragment之间的通信。例子:

定义接口并调用方法:

 

  

实现接口,在这个方法中可以进行与其他Fragment的数据的交互:

  

可以通过FragmentManagerfindFragmentById()来查找一个Fragment

 

 

 

 

谷歌api

A Fragment is a piece of an application's user interface or behavior that can be placed in an Activity. Interaction with fragments is done through FragmentManager, which can be obtained via Activity.getFragmentManager() and Fragment.getFragmentManager().

The Fragment class can be used many ways to achieve a wide variety of results. In its core, it represents a particular operation or interface that is running within a larger Activity. A Fragment is closely tied to the Activity it is in, and can not be used apart from one. Though Fragment defines its own lifecycle, that lifecycle is dependent on its activity: if the activity is stopped, no fragments inside of it can be started; when the activity is destroyed, all fragments will be destroyed.

All subclasses of Fragment must include a public empty constructor. The framework will often re-instantiate a fragment class when needed, in particular during state restore, and needs to be able to find this constructor to instantiate it. If the empty constructor is not available, a runtime exception will occur in some cases during state restore.

1、DialogFragment的实现不同的表现如下面两种:在FragmentDialogOrActivity中可以看到具体的实现过程,不过就也下面的体现而忆。

当作为普通对话框显示时,调用方法如下:

void showDialog() {  

   // 创建 MyDialogFragment的实例并作为对话框显示  

   DialogFragment newFragment = MyDialogFragment.newInstance();  

   newFragment.show(getFragmentManager(), "dialog");  

当作为普通视图显示时,调用方法如下:FragmentTransaction ft = getFragmentManager().beginTransaction();  

DialogFragment newFragment = MyDialogFragment.newInstance();  

ft.add(R.id.embedded, newFragment);  

ft.commit(); 

DialogFragment也支持自定义对话框的视图,自定义视图的方法为onCreateView ()方法。如果对话框的实现是从早期代码中移植过来的,则可以通过 onCreateDialog()封装Dialog对象来减少开发时间。

DialogFragment的实现可以参考APIdemo的FragmentAlertDialog,里面通过一个静态类的静态方法来实现化一个dialogfragment的实例。

好像看过的例子都是通过静态的方式来实现化了,再加上一个参数的加载 setArguments

如下图:

        public static MyAlertDialogFragment newInstance(int title) {
            MyAlertDialogFragment frag = new MyAlertDialogFragment();
            Bundle args = new Bundle();
            args.putInt("title", title);
            frag.setArguments(args);
            return frag;
        }

实现的弹出界面在onCreateView () 或是 onCreateDialog()中实现。

2、从activity向fragment传递参数。

方法是可以通过setArguments(String str)这样的方法来传递的。

从目前读到的DEMO来看是可以这样设置。虽然也是可以直接传过来。不过有这样的方法那就用就是的。

3、fragment也是可以支持内容菜单的。和activity一样注册内容菜单就可以了。registerForContextMenu(int rid);

4、fragmentManager可以实现管理activity中fragment通过调用activity的getFragmentManager()取得它的实例.

 

FragmentManager可以做如下一些事情:

1、使用findFragmentById() (用于在activity layout中提供一个UI的fragment)或findFragmentByTag()

   (适用于有或没有UI的fragment)获取activity中存在的fragment

2、将fragment从后台堆栈中弹出, 使用 popBackStack() (模拟用户按下BACK 命令).//复制来的,不是很明白

3、使用addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener.

5FragmentTransaction对fragment进行添加,移除,替换,以及执行其他动作重点。

从 FragmentManager 获得一个FragmentTransaction的实例 :

FragmentManager fragmentManager = getFragmentManager(); 

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

每一个事务都是同时要执行的一套变化.可以在一个给定的事务中设置你想执行的所有变化,

使用诸如 add(), remove(), 和 replace().然后要给activity应用事务必须调用 commit().

apidemo中的FragmentCustomAnimations例子就是用到了activity中的返回的堆栈的保存。

用到的方法就是FragmentTransaction的 addToBackStack(null);把fragment放在堆栈里面去。

但是在做这之前要把他的状态保存好,这时就要重写onSaveInstanceState的方法,但在oncreate的时候取出保存状态的值。再返回。

具体看apidemo的FragmentCustomAnimations

 

添加变化到 FragmentTransaction的顺序不重要, 除以下例外:

 必须最后调用 commit().

 如果添加多个fragment到同一个容器那么添加的顺序决定了它们在view hierarchy中显示的顺序.

当执行一个移除fragment的事务时如果没有调用 addToBackStack(), 那么当事务提交后那个fragment会被销毁,并且用户不能导航回到它有鉴于此当移除一个fragment,如果调用了 addToBackStack(), 那么fragment会被停止如果用户导航回来,它将会被恢复.我认为是重要的, 

以上的话,可以理解,remove后,加到堆栈后。按返回还是可以返回到之前的fragment,具体可以参考:FragmentDialog

 

6、fragment的显示和隐藏可以用FragmentTransaction的show 或是hide来实现,

 ft.show(fragment);
 ft.hide(fragment);

7、 findFragmentById可以通过查找xml布局文件中android:id来查找 。

而findFragmentByTag也是可以的,通过 android:tag这个标记来查找,不过好像不是很灵活,也可以用下面的代码来增加。

Fragment prev = getFragmentManager().findFragmentByTag("dialog");

通过show中的第二个参数来显示,第二个参数就是tag

 newFragment.show(ft, "dialog");

大概也就是通过getActivity,getFragmentManager()的方法来取得各自的控件。

activity响应fragment的事件

有点难懂。不过还是可以看,也可以看原文博客,如上。

自己也没有实现这个DEMO,实现了再发上来。

好了,fragment应该也可以结束了。

就是看了实例,不过还没有做过项目来实践……

还有的问题:生命周期还没有写上。后面补上

Fragmentactivity还要多出几个生命周期回调方法,这些额外的方法是为了与activity的交互而设立,如下:

onAttach()

fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。交互的时候还是可以用到的。

onCreateView()

activity要得到fragmentlayout时,调用此方法,fragment在其中创建自己的layout(界面)

onActivityCreated()

activityonCreated()方法返回后调用此方法。、、、、g不是很明白。

onDestroyView()

fragmentlayout被销毁时被调用。

onDetach()

fragment被从activity中删掉时被调用。

一旦activity进入resumed状态(也就是running状态),你就可以自由地添加和删除fragment了。因此,只有当activityresumed状态时,fragment的生命周期才能独立的运转,其它时候是依赖于activity的生命周期变化的。

onCreate

   系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。 

onCreateView

   用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。 

onPause 

    当用户离开这个Fragments 的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。更多的事件可以参考上图的生命周期关系图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值