东西主要是整合了几个大婶子之作
fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。可以看做是一个子Activity。
创建一个Fragment和创建一个Activity很类似,继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局。例子:
Fragment的生命周期方法依赖于Activity的生命周期,例如一个Activity的onPause()的生命周期方法被调用的时候这个Activity中的所有的Fragment的onPause()方法也将被调用。
使用XML添加Fragment到Activity
尽管Fragment可以被多个Activity重用,但是您也必须把Fragment关联到一个FragmentActivity上。可以使用XML布局文件的方式来实现这种关联。
说明:上面的所说的FragmentActivity适用在API在3.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中定义一个接口,然后再这个接口中定义一个方法,在Fragment的onAttach()方法中调用这个接口中的方法。然后让Activity实现这个方法来完成Activity和Fragment之间的通信。例子:
定义接口并调用方法:
实现接口,在这个方法中可以进行与其他Fragment的数据的交互:
可以通过FragmentManager的findFragmentById()来查找一个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中可以看到具体的实现过程,不过就也下面的体现而忆。
当作为普通对话框显示时,调用方法如下:
1 void showDialog() {
2 // 创建 MyDialogFragment的实例并作为对话框显示
3 DialogFragment newFragment = MyDialogFragment.newInstance();
4 newFragment.show(getFragmentManager(), "dialog");
5 }
6 当作为普通视图显示时,调用方法如下:FragmentTransaction ft = getFragmentManager().beginTransaction();
7 DialogFragment newFragment = MyDialogFragment.newInstance();
8 ft.add(R.id.embedded, newFragment);
9 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.
5、FragmentTransaction对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应该也可以结束了。
就是看了实例,不过还没有做过项目来实践……
还有的问题:生命周期还没有写上。后面补上
Fragment比activity还要多出几个生命周期回调方法,这些额外的方法是为了与activity的交互而设立,如下:
onAttach()
当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。交互的时候还是可以用到的。
onCreateView()
当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。
onActivityCreated()
当activity的onCreated()方法返回后调用此方法。、、、、g不是很明白。
onDestroyView()
当fragment的layout被销毁时被调用。
onDetach()
当fragment被从activity中删掉时被调用。
一旦activity进入resumed状态(也就是running状态),你就可以自由地添加和删除fragment了。因此,只有当activity在resumed状态时,fragment的生命周期才能独立的运转,其它时候是依赖于activity的生命周期变化的。
onCreate
系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。
onCreateView
用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。
onPause
当用户离开这个Fragments 的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。更多的事件可以参考上图的生命周期关系图。