本文主要介绍Android Fragment使用的相关资料,帮助你更好的理解和学习使用Android开发。感兴趣的朋友可以了解一下。
目录
动态添加FragmentFragment生命周期的初步探索我们都知道Android上的界面展示是通过Activity来实现的,如此常用相信大家已经非常熟悉了,这里就不赘述了。
然而,活动也有其局限性。同样的界面在手机上可能好看,在平板上可能不好看,因为平板的屏幕很大,手机在平板上的界面可能拉伸太多,控件间距太大。这时候更好的体验效果是在活动中嵌入‘小活动’,然后每个‘小活动’都可以有自己的布局。所以,今天的主角片段在舞台上。
Fragment初探
为了让界面在平板上更好的显示,Android在3.0版本中引入了片段功能,这个功能非常类似于Activity,可以像Activity一样包含布局。片段通常嵌套在活动中使用。现在想象一下这个场景:有两个片段,片段1包含一个ListView,每行显示一本书的标题。片段2包括TextView和ImageView来显示书的详细内容和图片。
如果程序现在以纵向模式运行在平板电脑或手机上,片段1可能嵌入在一个活动中,而片段2可能嵌入在另一个活动中,如下图所示:
现在,如果程序在平板电脑上以横向模式运行,两个片段可以嵌入到同一个活动中,如下图所示:
可见使用Fragment可以让我们更充分的利用平板的屏幕空间。让我们一起来探讨如何使用Fragment。
首先需要说明的是,Fragment是3.0版本引入的。如果使用的是3.0之前的系统,需要导入android-support-v4的jar包,才能使用碎片功能。
创建一个名为Fragments的新项目,然后在布局文件夹下创建一个名为fragment1.xml的新布局文件:
linear layout xmlns:Android=' http://schemas . Android . com/apk/RES/Android '
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
android:background='#00ff00 '
文本视图
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
android:text='这是片段1 '
android:textColor='#000000 '
android:textSize='25sp' /
/线性布局
如您所见,这个布局文件非常简单,只添加了一个LinearLayout和一个TextView。让我们做同样的事情,创建一个新的fragment2.xml:
linear layout xmlns:Android=' http://schemas . Android . com/apk/RES/Android '
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
android:background='#ffff00 '
文本视图
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
android:text='这是片段2 '
android:textColor='#000000 '
android:textSize='25sp' /
/线性布局
然后创建一个新的类Fragment1,它继承自Fragment1:
公共类Fragment1扩展片段{
@覆盖
公共视图onCreateView(LayoutInflater inflater,ViewGroup容器,Bundle savedInstanceState) {
返回inflator . inflate(r . layout . fragment 1,container,false);
}
}
我们可以看到,这个类也很简单,主要是加载我们刚刚写的fragment1.xml布局文件并返回。同样,让我们编写片段2:
公共类Fragment2扩展片段{
@覆盖
公共视图onCreateView(LayoutInflater inflater,ViewGroup容器,Bundle savedInstanceState) {
返回inflator . inflate(r . layout . fragment 2,container,false);
}
}
然后,打开或创建一个新的Activity_main.xml作为主活动的布局文件,添加两个对片段的引用,并使用android:name前缀来引用特定的片段:
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
android:baselineAligned='false '
碎片
android:id='@ id/fragment1 '
Android:name=' com。举例。片段演示。片段1 '
android:layout_width='0dip '
Android:layout _ height=' match _ parent '
android:layout_weight='1' /
碎片
android:id='@ id/fragment2 '
Android:name=' com。举例。片段演示。片段2 '
android:layout_width='0dip '
Android:layout _ height=' match _ parent '
android:layout_weight='1' /
/线性布局
最后打开或新建主要活动作为程序的主活动,里面的代码非常简单,都是自动生成的:
公共类主要活动扩展活动{
@覆盖
受保护的void onCreate(Bundle saved instancestate){
超级棒。oncreate(savedInstanceState);
setContentView(r . layout。活动_主);
}
}
现在我们来运行一次程序,就会看到,一个活动很融洽地包含了两个片段,这两个碎片平分了整个屏幕,效果图如下:
动态添加Fragment
你已经学会了如何在可扩展标记语言中使用片段,但是这仅仅是碎片最简单的功能而已1000片段。真正的强大之处在于可以动态地添加到活动当中,因此这也是你必须要掌握的东西。当你学会了在程序运行时向活动添加片段,程序的界面就可以定制的更加多样化。下面我们立刻来看看,如何动态添加片段。
还是在上一节代码的基础上修改,打开activity_main.xml,将其中对碎片的引用都删除,只保留最外层的线性布局,并给它添加一个id,因为我们要动态添加片段,不用在可扩展标记语言里添加了,删除后代码如下:
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
android:id='@ id/main_layout '
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
android:baselineAligned='false '
/线性布局
然后打开主要活动,修改其中的代码如下所示:
公共类主要活动扩展活动{
@覆盖
受保护的void onCreate(Bundle saved instancestate){
超级棒。oncreate(savedInstanceState);
setContentView(r . layout。活动_主);
display display=getWindowManager().getDefaultDisplay();
如果(显示。getwidth()显示。getheight()){
片段1片段1=新片段1();
getFragmentManager().beginTransaction().替换(R.id.main_layout,fragment1).commit();
}否则{
片段2片段2=新片段2();
getFragmentManager().beginTransaction().替换(R.id.main_layout,fragment2).commit();
}
}
}
首先,我们要获取屏幕的宽度和高度,然后进行判断,如果屏幕宽度大于高度就添加片段1,如果高度大于宽度就添加碎片2 .动态添加碎片主要分为四步:
1.获取到碎片管理器,在活动中可以直接通过getFragmentManager得到。
2.开启一个事务,通过调用开始交易方法开启。
3.向容器内加入片段,一般使用替换方法实现,需要传入容器的身份证明(识别)和碎片的实例。
4.提交事务,调用犯罪方法提交。
现在运行一下程序,效果如下图所示:
如果你是在使用模拟器运行,按下ctrl F11切换到竖屏模式。效果如下图所示:
Fragment的生命周期
和活动一样,片段也有自己的生命周期,理解碎片的生命周期非常重要,我们通过代码的方式来瞧一瞧碎片的生命周期是什么样的:
公共类碎片1扩展片段{
public static final String TAG=" fragment 1 ";
@覆盖
公共视图oncreate view(LayoutInflater inflater,视图组容器,Bundle savedInstanceState) {
Log.d(标签,‘oncreate view’);
返回充气机。膨胀(r .布局。片段1,容器,假);
}
@覆盖
公共附加时无效(活动Activity){
super.onAttach(活动);
Log.d(标签,'附加时');
}
@覆盖
创建时的公共void(绑定保存的实例状态){
超级棒。oncreate(savedInstanceState);
Log.d(标签,' onCreate ');
}
@覆盖
已创建活动的公共void(捆绑包保存的instancestate){
超级棒。在创建活动时(savedInstanceState);
Log.d(标签,' on activity created ');
}
@覆盖
public void onStart() {
超级棒。onstart();
Log.d(标签,‘onStart’);
}
@覆盖
公共void onResume() {
超级棒。on resume();
Log.d(标签,‘简历上’);
}
@覆盖
public void onPause() {
超级棒。on pause();
Log.d(标签,‘暂停’);
}
@覆盖
public void onStop() {
超级棒。onstop();
Log.d(标签,‘on stop’);
}
@覆盖
public void onDestroyView() {
超级棒。ondestroyview();
Log.d(标签,‘onDestroyView’);
}
@覆盖
public void onDestroy() {
超级棒。on destroy();
Log.d(标签,‘on destroy’);
}
@覆盖
public void onDetach() {
超级棒。on detach();
Log.d(标签,'在分离时');
}
}
可以看到,上面的代码在每个生命周期的方法里都打印了日志,然后我们来运行一下程序,可以看到打印日志如下:
这时点击一下家键,打印日志如下:
如果你再重新进入进入程序,打印日志如下:
然后点击背部键退出程序,打印日志如下:
看到这里,我相信大多数朋友已经非常明白了,因为这和活动的生命周期太相似了。只是有几个活动中没有的新方法,这里需要重点介绍一下:
奥纳塔赫方法:片段和活动建立关联的时候调用。
onCreateView方法:为碎片加载布局时调用。
onActivityCreated方法:当活动中的onCreate方法执行完后调用。
onDestroyView方法:片段中的布局被移除时调用。
onDetach方法:片段和活动解除关联的时候调用。
Fragment之间进行通信
通常情况下,活动都会包含多个片段,这时多个碎片之间如何进行通信就是个非常重要的问题了。我们通过一个例子来看一下,如何在一个碎片中去访问另一个碎片的视图。
还是在第一节代码的基础上修改,首先打开片段2.xml,在这个布局里面添加一个按钮:
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
安卓:方向='垂直'
android:background='#ffff00 '
文本视图
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
android:text='这是片段2 '
android:textColor='#000000 '
android:textSize='25sp' /
纽扣
android:id='@ id/button '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
android:text='Get fragment1 text '
/
/线性布局
然后打开片段1.xml,为文本视图添加一个id:
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
android:background='#00ff00 '
文本视图
android:id='@ id/fragment1_text '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
android:text='这是片段1 '
android:textColor='#000000 '
android:textSize='25sp' /
/线性布局
接着打开Fragment2.java,添加onActivityCreated方法,并处理按钮的点击事件:
公共类碎片2扩展片段{
@覆盖
公共视图oncreate view(LayoutInflater inflater,视图组容器,Bundle savedInstanceState) {
返回充气机。膨胀(r .布局。片段2,容器,假);
}
@覆盖
已创建活动的公共void(捆绑包保存的instancestate){
超级棒。在创建活动时(savedInstanceState);
Button Button=(Button)get activity()。findViewById(r . id。按钮);
按钮。setonclicklistener(new OnClickListener(){
@覆盖
公共void onClick(视图五){
TextView TextView=(TextView)get activity().findViewById(r . id。片段1 _正文);
Toast.makeText(getActivity()、textView.getText()、Toast .长度_长)。show();
}
});
}
}
现在运行程序,点击fragment2上的按钮。效果如下图所示:
我们可以看到fragment1中的视图在fragment2中成功获取,弹出了Toast。这是如何实现的?它们主要通过getActivity的方法来实现。getActivity方法允许片段获取关联的活动,然后调用活动的findViewById方法获取与此活动关联的其他片段的视图。
以上是Android Fragment完整解决方案的细节。更多关于Android Fragment的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。