今天学习下 Android中的 Fragment 和 FragmentActivity,因为没有4.0手机,平台是2.3.3 所以我是使用 v4 support 包来进行学习。

要想用Fragment 功能必须先让activity继承FragmentActivity,其原因是里面包含了Fragment运作的FragmentManager接口的实现类 FragmentManagerImpl ,由这个类管理所有Fragment的显示、隐藏

1.使用最简单的Fragment,我们只要继承Fragment就可以

  1. public class TextFragment extends Fragment{
  2. private String mMsg;
  3. public void setMessage(String message){
  4. this.mMsg = message;
  5. }
  6. @Override
  7. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  8. Bundle savedInstanceState) {
  9. // TODO Auto-generated method stub
  10. final Context context = getActivity();
  11. FrameLayout root = new FrameLayout(context);
  12. root.setBackgroundColor(Color.YELLOW);
  13. TextView tv = new TextView(context);
  14. tv.setText(mMsg);
  15. tv.setGravity(Gravity.CENTER);
  16. root.addView(tv, new FrameLayout.LayoutParams(
  17. ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
  18. return root;
  19. }
  20. }

首先Fragment 就可以把它当作一个view , 只不过这个view 与 activity一样有了生命周期函数

Fragment.onCreateView() 函数就是用于生成这个Fragment布局的view的,类似baseadapter.getView()

这样一个包含一个TextView的简单布局就完成了。

2.重写我们自己的FragmentActivity.

这里面主要要通过FragmentManager 来进行Fragment的添加和删除:

  1. public class DoorFragmentActivity extends FragmentActivity{
  2. public static final String FRAG_SMS = "sms_list_frag";
  3. public static final String FRAG_TEXT = "text_frag";
  4. private Fragment mSMSFragment;
  5. private Fragment mTextFragment;
  6. private FragmentManager mFragMgr;
  7. private Button mMenuBtn;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. // TODO Auto-generated method stub
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.door_fragment_activity_layout);
  13. mFragMgr = getSupportFragmentManager();
  14. mMenuBtn = (Button) findViewById(R.id.door_menu_btn);
  15. mMenuBtn.setOnClickListener(new OnClickListener() {
  16. @Override
  17. public void onClick(View v) {
  18. // TODO Auto-generated method stub
  19. showFragments(FRAG_TEXT, true);
  20. }
  21. });
  22. mMenuBtn.setOnLongClickListener(new OnLongClickListener() {
  23. @Override
  24. public boolean onLongClick(View v) {
  25. // TODO Auto-generated method stub
  26. return false;
  27. }
  28. });
  29. initFragments();
  30. showFragments(FRAG_SMS, false);
  31. }
  32. private void initFragments(){
  33. mSMSFragment = new SMSListFragment();
  34. TextFragment textfrag = new TextFragment();
  35. textfrag.setMessage("这是 菜单界面");
  36. mTextFragment = textfrag;
  37. }
  38. private void showFragments(String tag, boolean needback){
  39. FragmentTransaction trans = mFragMgr.beginTransaction();
  40. if(needback){
  41. trans.setCustomAnimations(R.anim.frag_enter,
  42. R.anim.frag_exit);
  43. trans.add(R.id.door_root_content_fl, getFragmentByTag(tag), tag);
  44. trans.addToBackStack(tag);
  45. }else{
  46. trans.replace(R.id.door_contents_fl, getFragmentByTag(tag), tag);
  47. }
  48. trans.commit();
  49. }
  50. private Fragment getFragmentByTag(String tag){
  51. if(FRAG_SMS.equals(tag)){
  52. return mSMSFragment;
  53. }
  54. if(FRAG_TEXT.equals(tag)){
  55. return mTextFragment;
  56. }
  57. return null;
  58. }
  59. }
  • 首先我们获取FragmentManager实现:直接调用 FragmentActivity.getSupportFragmentManager(),看源码可以知道这返回的是FragmentManager内部定义的实现类FragmentManagerImpl。
  • 我们获取了FragmentManagerImpl后我们其实不咋操作这个类,只调用FragmentManager.beginTransation(),这个获取FragmentTransation接口的实现类(里面具体是BackStackRecord类的实例),我们关于Fragment的所有操作都是通过它来完成的,因为没仔细研究,我只了解直接自己在代码里面定义Fragment而没有在xml里面写(xml写觉得有点别扭)

我们主要通过 FragmentTransation的一些方法来处理Fragment的:

1) trans.add(fragment, tag);  这个实际是 containerViewId = 0 调用的3)
2) trans.add(containerViewId, fragment);  这个实际是 tag = null 调用的 3)
3) trans.add(containerViewId, fragment, tag);  如果containerViewId != 0实际上调用的是获取到

fragment的 onCreateView方法返回的view 并加入到containerViewId这个viewgroup中去即                  viewgroup.addView(fragment.onCreateView());

未解决问题:containerViewId = 0 的时候代表什么??

4) trans.replace(containerViewId, fragment)  一样是null tag调用 5)
5) trans.replace(containerViewId, fragment, tag)  这个一样是添加一个fragment到对应的container中去,只不过比add多了一步对相同containerViewId中已有的fragment检索,进行removeFragment操作,再去添加这个新来的fragment

6) trans.addToBackStack(tag); 如果你的fragment对于back键有类似activity的回退响应,就要记得把它加入到里面去,trans里面模拟了栈,但是我的回退没有响应我设置的exit anim 这个无语还没解决

3.再使用下ListFragment,我这里写的是SMSListFragment继承了ListFragment:

  1. public class SMSListFragment extends ListFragment{
  2. private ConversationListAdapter mAdapter;
  3. private ConversationQuery mQuery;
  4. private long startTime;
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. // TODO Auto-generated method stub
  8. super.onCreate(savedInstanceState);
  9. mAdapter = new ConversationListAdapter(getActivity());
  10. mQuery = new ConversationQuery(getActivity().getContentResolver());
  11. }
  12. @Override
  13. public void onActivityCreated(Bundle savedInstanceState) {
  14. // TODO Auto-generated method stub
  15. super.onActivityCreated(savedInstanceState);
  16. setListAdapter(mAdapter);
  17. }
  18. @Override
  19. public void onStart() {
  20. // TODO Auto-generated method stub
  21. super.onStart();
  22. startAsyncQuery();
  23. }
  24. @Override
  25. public void onStop() {
  26. // TODO Auto-generated method stub
  27. super.onStop();
  28. mAdapter.getCursor().close();
  29. mAdapter.changeCursor(null);
  30. }
  31. public void startAsyncQuery() {
  32. startTime = System.currentTimeMillis();
  33. mQuery.startQuery(1, null, Conversation.sAllThreadsUri,
  34. Conversation.ALL_THREADS_PROJECTION, null, null,
  35. Conversation.CONVERSATION_ORDER);
  36. }
  37. private final class ConversationQuery extends AsyncQueryHandler {
  38. public ConversationQuery(ContentResolver cr) {
  39. super(cr);
  40. // TODO Auto-generated constructor stub
  41. }
  42. @Override
  43. protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
  44. // TODO Auto-generated method stub
  45. System.out.println("conversation cursor size : "
  46. + cursor.getCount());
  47. mAdapter.changeCursor(cursor);
  48. Toast.makeText(
  49. getActivity(),
  50. "查询短信会话个数:" + cursor.getCount() + ",花费"
  51. + (System.currentTimeMillis() - startTime) + " ms",
  52. Toast.LENGTH_LONG).show();
  53. }
  54. }
  55. }

代码中可以知道和使用普通的ListActivity完全没区别,

onCreate()中完成自己要一次性初始的东西,我在里面主要是初始化一个adapter和一个对sms数据库的查询

在onActivityCreated()中将adapter设置给listview,这个不确定有没有更好的位置,

然后进入我们熟悉的生命周期方法:

onStart()中,开启查询

onStop()中,我们界面已经不在显示了,所以我们不关心数据库变化了,close cursor

4.主页面的布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/door_root_content_fl"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent" >
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:orientation="vertical" >
  10. <FrameLayout
  11. android:id="@+id/door_contents_fl"
  12. android:layout_width="match_parent"
  13. android:layout_height="0dp"
  14. android:layout_weight="1" />
  15. <LinearLayout
  16. android:layout_width="match_parent"
  17. android:layout_height="55dp"
  18. android:orientation="horizontal" >
  19. <Button
  20. android:id="@+id/door_menu_btn"
  21. android:layout_width="match_parent"
  22. android:layout_height="match_parent"
  23. android:gravity="center"
  24. android:text="菜单" />
  25. </LinearLayout>
  26. </LinearLayout>
  27. </FrameLayout>

5.运行效果图:

转 Fragment 和 FragmentActivity的使用的更多相关文章

  1. Fragment与FragmentActivity的关系

    前阵用viewpaper+fragment做滑动引导,查阅了下网上的资料,发现在有两种做法,一个是自建类直接继承Activity另一种是继承FragmentActivity,很是迷惑,在查了些goog ...

  2. Fragment 和 FragmentActivity的使用

    Fragment 和 FragmentActivity的使用 http://blog.csdn.net/izy0001989624/article/details/17072211

  3. Fragment与FragmentActivity通信封装

    在项目里面会经常用到Fragment与FragmentActivity,比如Fragment之间的界面切换与Fragment之间的值传递等等,为了方便起见我把Fragment和FragmentActi ...

  4. Fragment和FragmentActivity的使用方法

    认识:首先我们知道Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容.模块化这些UI面板以便提供给其他Acitivity使用便利.同时我们显示的Fragment也会受到当前 ...

  5. ☆ fragment和fragmentactivity解析 (转)

    一.为什么要使用Fragment  1.当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一 个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单 ...

  6. Fragment 和 FragmentActivity的使用(二)

      今天继续完成剩下的学习部分,现在项目很多地方使用viewpager来提供滑动,今天记录学习viewpager配合fragment的显示,增加一个CallLogsFragment配合之前SMSLis ...

  7. android Fragment和FragmentActivity

    MainActivity.java import android.app.AlertDialog; import android.app.Notification; import android.co ...

  8. Android Fragment和FragmentActivity区别和用法

    Android Fragment是Android4.0以上才有的:而FragmentActivity是为了兼容4.0以下版本的Fragment使用的. 所以如果你想兼容4.0以下Android版本使用 ...

  9. fragment和fragmentactivity解析

    一.为什么要使用Fragment  1.当我们须要动态的多界面切换的时候,就须要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个 ...

随机推荐

  1. Python 2 中的编码

    在 Python 尤其是 Python2 中,编码问题是困扰开发者尤其初学者的一大问题.什么 Unicode/UTF-8/str ,又是 decode/encode 的,搞得人头都大了.其实不然,这有 ...

  2. ios设置textField只能输入数字用于电话号码

    首先在.xib中将UITextField的Keyboard设置为Number Pad,但是使用时键盘会切回别的键盘无法对内容进行校验.通过神奇的百度我知道了通过以下方法可以解决这样的问题: 首先让.x ...

  3. 批量创建IP方法

    以下教程,将告诉大家如何在Windows系统中通过命令行,批量添加IP.目标,在本机的的网卡名称为“本地连接”的网卡中,批量添加192.168.1段的ip地址,起开始IP为10,每次增加1,知道22为 ...

  4. Entity Framework技巧系列之九 - Tip 35 - 36

    提示35. 怎样实现OfTypeOnly<TEntity>()这样的写法 如果你编写这样LINQ to Entities查询: 1 var results = from c in ctx. ...

  5. A - 娜娜梦游仙境系列——诡异的钢琴

    A - 娜娜梦游仙境系列——诡异的钢琴 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Othe ...

  6. PMBok项目管理

    这就是项目管理的九大领域:整合管理.范围管理.时间管理.费用管理.质量管理.人力资源管理.沟通管理.风险管理.采购管理. 项目管理好像一头大象,将其大卸九块之后,要装进冰箱就容易多了. 看看书上是怎样 ...

  7. python--windows下安装BeautifulSoup

    python有很多内置的模块可以不安装使用,用起来非常方便,但是也有一些挺有用的非内置的模块不能直接使用,需要话费点力气手动安装. 进入python安装目录下的Scripts目录,查看是否有pip工具 ...

  8. github  安装配置以及使用遇到的一些问题

    Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括Rubinius ...

  9. EGL接口介绍-----Android OpenGL ES底层开发

    引自:http://www.cnitblog.com/zouzheng/archive/2011/05/30/74326.html EGL 是 OpenGL ES 和底层 Native 平台视窗系统之 ...

  10. UVA 11027 - Palindromic Permutation

    题目意思为解码字符串,要输出第n个回文字符串,因为对称关系,前一半确定了,后一半也就跟着确定了,所以n其实就是前一半字符串的编码,还要减去1,直接解码出来再复制给后半即可 #include<cs ...