Android 值Fragment篇
好久没写博客了,本来打算是一周写一遍总结的,但是计划永远赶不上变化,前两周还在学习ndk开发,本周就被公司安排又来开始做android界面的开发了。今天就把我这一周来用到的一个知识点,Fragment和大家分享一下。
1、Fragment允许将Activity拆分成过关完全独立封装的可重用组件,每一组件都有他自己的生命周期和ui布局。我先描述一下我要做的东西,就是在Activity的主界面,做一个界面切换的布局,如图
这是我们的效果图,点击下面的各个选项,界面可以相互切换,要实现这个功能,可以有很多种方法,如利用viewPager控件,viewpager控件可以实现左右切换,但是下面的这些选项(动态,首页。。。)等等就不太容易布局了。也可以单独为没有选项做一个Activity,但是那样切换的时候,资源消耗过大不说,也容易出现界面切换太明显的效果,所以我就考虑用Fragment了。
2、Fragment最大的优点就是让你可以灵活动态的处理界面问题,你可以根据需要,随意对Fragment进行添加,删除,和替换,我的这个项目,主要是用了替换。
3、创建一个新的Fragment,可以通过基础Fragment类来创建一个新的Fragment,在android框架内编程,这都是固定模式了。大多数情况下,需要为Fragment分配一个ui这就需要重写onCrateView方法来填充并返回需要的view层次。
这是我的动态Fragment的onCreatView方法,一般在返回布局前,需要对布局进行初始化,就像在Activity的onCreate方法里面做的事一样。这里面也会涉及到Fragment的生命周期,其实和Activity也差不多,这里就不多说了。
4、要对Fragment进行控制,就要有管理Fragment的类,在这里,android给我们提供了一个FragmentManager类,可以通过Activity的getFragmentManager()方法来的得到这个FragmentManager的对象。而这个FragmentManager就提供了添加,删除,替换Fragment的方法。
5、为Activity添加Fragment最简单的方式是在布局文件中直接使用Fragment标签来包含你之前新建的Fragment类就ok了。如图
当然,在我的项目中我是用了另外一种方式,就是在布局文件中先放一个Fragment的容器,先占一个位置,然后在代码中更具需要,随意添加,替换那都是你的事。在布局中的代码如图:
这个容器做好了,那就可以在代码中控制他了。
6、添加,删除,替换,都用同一个模式就ok了。首先要通过FragmentManager对象得到一个Fragment事务,即FragmentTransaction的对象,通过FragmentTransaction对象,就可以进行添加,删除,替换了。代码如下。
// 开启事务
mFragmentTransaction = mFragmentManager.beginTransaction();
// 添加首页Fragment
mFragmentTransaction.add(R.id.main_ui_container_framelayout, mDynamicFragment);
// 替换Fragment
mFragmentTransaction.replace(R.id.main_ui_container_framelayout,mDynamicFragment);
//删除Fragment
mFragmentTransaction.remove(mDynamicFragment);
// 提交事务
mFragmentTransaction.commit();
最后一点要记得提交事务。
7、如果你是在Activity的布局文件中直接使用Fragment标签来添加的Fragment,那你就可以再Activity中使用FindFragmentByID这个方法来通过Fragment的资源id来找到这个Fragment,但是,如果你在Activity的布局文件中使用的是布局容器,那就只能用findFragmentByTag()这个方法了。这一点主要一下。
8、Fragment和back栈。Fragment能够创建动态的Activity布局,这些布局可以被修改是ui发生重大的变化,在某些情况下,这些改变可以视为一个新的屏幕,在这样的情况下,用户可能会理所当然的期望按下back按键,程序会退回到上一个界面,那android也提供了这样的技术,你只有在commit方法之前,调用FragmentTransaction的addToBackStack()方法,那你commit之后到了新的界面,然后按下back按键,程序就回到了你上一个界面。
比如。
// 开启事务
mFragmentTransaction = mFragmentManager.beginTransaction();
// 替换Fragment
mFragmentTransaction.replace(R.id.main_ui_container_framelayout,mDynamicFragment);
// 添加回退栈
mFragmentTransaction.addToBackStack("");
// 提交事务
mFragmentTransaction.commit();
假如你是用现在的mDynamicFragment代替了之前的Fragment1,那有了addToBackStack方法,当你在mDynamicFragment界面的时候,你按下back按钮,那程序就回到了Fragment1界面了。
呵呵,至此,Fragment就算是讲完了,如果有什么不明白的,加我qq,大家在一起相互讨论吧。