认识:首先我们知道Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容。模块化这些UI面板以便提供给其他Acitivity使用便利。同时我们显示的Fragment也会受到当前的这个Acitivity生命周期影响。(而平常的Fragment有其自己的生命周期)



一、使用方法:





1、创建一个或者多个你需要的Fragment类,其实就是类似activity一样,也有OnCreate()等回调函数。





2、如果要让当前的程序也就是Activity使用Fragment的话,需要把Acitivity中相关的回调函数内容搬过去。you might simply move code from your activity's callback methods into the respective callback methods of your fragment



一般地,我们需要以下回调函数:



onCreate()

onCreateView()

onPause()



除了以上3个我们基本上都要用到的回调函数方法,那么我们写得Fragment中还有其他: Handling the Fragment Lifecycle



二、关于继承Fragment类





除了基本的Fragment类,我们还可以继承的有:



DialogFragment

ListFragment

PreferenceFragment



三、添加用户界面





我们再 onCreateView() 里面处理我们的Fragment要显示的界面,返回的是一个View,这个View其实就是我们定义这个Fragment的Layout的root项(最外的、最大的那个哦!)。

从XML布局中生成View我们用LayoutInflater这个助手类提供的方法。

文解决我这两天的问题,故转载:原文Android
Tabhost with FragmentActivity

 

2012-05-07 更新)接續Android TabHost中切換Activity記錄了使用ActivityGroup達到在TabHost中切換Activity的方法,也在Android
Screen Orientation Event螢幕方向處理+Acitivity Liftcycle
記錄了當螢幕方向改變時的處理,這篇小蛙繼續記錄用FragmentActivity取代ActivityGroup,透過FragmentActivity內建的BackStack來管理倒退歷程。

MainTabActivity.java : 主要的Tabhost Activity。

[java] view
plain
copy

  1. public class MainTabActivity extends Activity {
  2. private TabHost mHost;
  3. // 在Activity中使用Tabhost必須要有LocalActivityManager物件來設定
  4. LocalActivityManager lam;
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. // main layout採用預設的Tabhost
  10. mHost = (TabHost) findViewById(android.R.id.tabhost);
  11. lam = new LocalActivityManager(MainTabActivity.this, false);
  12. lam.dispatchCreate(savedInstanceState);
  13. mHost.setup(lam);
  14. mHost.addTab(mHost.newTabSpec("Tab1").setIndicator("Tab1").setContent(new Intent(MainTabActivity.this, FragmentActivity1.class)));
  15. mHost.addTab(mHost.newTabSpec("Tab2").setIndicator("Tab2").setContent(new Intent(MainTabActivity.this, FragmentActivity2.class)));
  16. }
  17. @Override
  18. protected void onPause() {
  19. // 漏掉這行一定出錯
  20. lam.dispatchPause(isFinishing());
  21. super.onPause();
  22. }
  23. @Override
  24. protected void onResume() {
  25. // 漏掉這行一定出錯
  26. lam.dispatchResume();
  27. super.onResume();
  28. }
  29. }

FragmentActivity1.java : 第一個Tab中用來管理Fragment的FragmentActivity。(2012-05-07更新)經由Jay留言後,小蛙詳細測了一下,發現FragmentActivity主畫面中的Button是沒辦法消失的(因為FragmentActivity的目的關係),因此改成這樣,讓FragmentActivity純粹當成容器,主要的內容還是以Fragment為主。(這個方法不是唯一,但是一個可行的方法,應該也有更好的做法!)

[java] view
plain
copy

  1. public class FragmentActivity1 extends FragmentActivity {
  2. public static FragmentManager fm;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.fragment_activity_1);
  7. fm = getSupportFragmentManager();
  8. // 只當容器,主要內容已Fragment呈現
  9. initFragment(new Fragment1());
  10. }
  11. // 切換Fragment
  12. public static void changeFragment(Fragment f){
  13. changeFragment(f, false);
  14. }
  15. // 初始化Fragment(FragmentActivity中呼叫)
  16. public static void initFragment(Fragment f){
  17. changeFragment(f, true);
  18. }
  19. private static void changeFragment(Fragment f, boolean init){
  20. FragmentTransaction ft = fm.beginTransaction();
  21. ft.replace(R.id.simple_fragment, f);
  22. if(!init)
  23. ft.addToBackStack(null);
  24. ft.commit();
  25. }
  26. }

Fragment1.java : 真正使用到的Fragment。

[java] view
plain
copy

  1. public class Fragment1 extends Fragment {
  2. @Override
  3. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  4. View v = inflater.inflate(R.layout.fragment_1, container, false);
  5. Button tv = (Button)v.findViewById(R.id.button2);
  6. tv.setOnClickListener(new View.OnClickListener() {
  7. @Override
  8. public void onClick(View v) {
  9. // 直接呼叫FragmentActivity1的靜態方法來做切換
  10. FragmentActivity1.changeFragment(new Fragment2());
  11. }
  12. });
  13. return v;
  14. }
  15. }

fragment_acitivity_1.xml : FragmentActivity layout。(2012-05-07修改) FragmentActivity只用來當容器,而不真正呈現內容(僅把Fragment內容載入)。

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical"
  6. android:id="@+id/simple_fragment">
  7. </LinearLayout>

fragment1.xml:Fragment layout,FragmentActivity載入的真正內容。

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical">
  6. <Button
  7. android:id="@+id/button2"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:text="Button" />
  11. </LinearLayout>

最後別忘了在AndroidManifest.xml中加入android:configChanges="orientation"設定。這樣就成功的使用在Activity中使用Tabhost並且透過FragmentActivity來管理Fragment囉!

下面讲讲为啥要用Fragment:

首先,Fragment可以兼容手机和平板,最大减少针对不同平台的工作量。

其次,Fragment可以向下兼容(通过android官方的Support
Package
),在2.x平台上没有任何问题。

最重要的是,Fragment实质上是一种可以包含控制代码的视图模块,可以非常方便的进行组合。



[另外,如果大家现在去看TabActivity的官方文档,会发现此类已被标记为deprecated,建议使用Fragment代替]



废话少说,给大家展示两个项目,都是github上面开源的。

1.水平分页指示器,google+中有用到这种效果,现已成为android4.0标配。

这个项目只是实现了分页指示。谷歌的Support Package自己内置了一套水平滑动的方案,非常实用,基于Fragment实现。

 

2.给大家一个完整的使用Fragment的项目案例。

这个项目做的好像是一个电视节目提醒之类的东西,运行截图如下:

下面附上这两个开源项目的地址:

1.水平分页指示器 
 https://github.com/tisa007/Android-ViewPagerIndicator/zipball/master

2.使用Fragment的项目案例  https://github.com/UweTrottmann/SeriesGuide

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

  1. ☆ fragment和fragmentactivity解析 (转)

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

  2. Fragment与FragmentActivity通信封装

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

  3. 转 Fragment 和 FragmentActivity的使用

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

  4. fragment和fragmentactivity解析

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

  5. Fragment与FragmentActivity的关系

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

  6. Fragment 和 FragmentActivity的使用

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

  7. FragmentTabHost切换Fragment时保存状态,避免切换Fragment走onCreateView和onDestroyView方法;

    FragmentTabHost这个控件每次切换Fragment,都会走Fragment的onCreateView和onDestroyView方法,多以每次切换都会创建和销毁Fragment实例,先来看 ...

  8. Fragment 和 FragmentActivity的使用(二)

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

  9. Fragment和FragmentActivity的使用

    可以分为下面的几部分: 使用支持库 创建一个Fragment 创建一个动态UI 多个Fragment之间的通信 1.使用支持库 如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容. 如果您的 ...

随机推荐

  1. php-resque 轻量级队列

    一:简介 github地址:https://github.com/chrisboulton/php-resque 这个轻量级队列是由 Ruby 开发的 Resque 启发而来的. 注意:1. php- ...

  2. thinkphp中用ajax对数据库进行操作

    删除和查看详情操作的共同语句:就是怎么显示表? 1.在主体中写表的开头行,想要显示的内容,并且加载数据也要显示的地方也建张表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 & ...

  3. 基于RBAC模型的权限系统设计(Github开源项目)

    RBAC(基于角色的访问控制):英文名称Rose base Access Controller.本博客介绍这种模型的权限系统设计.取消了用户和权限的直接关联,改为通过用户关联角色.角色关联权限的方法来 ...

  4. label与input之间的对应

    实现点击文字对应的框可以被选中,再点击一下文字框又取消选中 label的for属性与input的id属性值对应,即可实现.

  5. 20165232 预备作业3 Linux安装及学习

    java第三次预作业--Linux安装及命令入门(学习记录) 通过老师给的学习基于VirtualBox虚拟机安装Ubuntu图文教程,我在自己笔记本上安装Linux操作系统,在安装过程中我遇到一些问题 ...

  6. HTTP深入理解

    HTTP被设计于二十世纪九十年代初期,是一种可扩展的协议, 它是应用层的协议, 通过TCP,或TLS加密的TCP连接来发送, 理论上任何可靠的传输协议都可以使用. 因其良好的扩展性,时至今日,它不仅被 ...

  7. Enum入门【原】

    package com.bobo.www.cxf.impl; public enum Traffic { Red(1), Green(2), Yellow(3);//必须最前面 private int ...

  8. DirectX11 With Windows SDK--04 使用DirectX Tool Kit帮助开发

    前言(2018/11/4) DXTK库现在已经不随Github项目提供,因为只用到了其中的键鼠类,已经过提取加入到后续的项目中 但是如果你需要配置DirectXTK到自己的项目当中,可以参考这篇博客进 ...

  9. GC ROOT

    (GC Root有哪些) 基本思想是通过一系列称为“GC roots”的对象作为起始点,可以作为根节点的是: 虚拟机栈(栈帧中的本地变量表)中引用的对象(即所有Java线程当前活跃的栈帧里指向GC堆里 ...

  10. 快速傅里叶变换(Fast Fourier Transform, FFT)和短时傅里叶变换(short-time Fourier transform,STFT )【资料整理】【自用】

    1. 官方形象展示FFT:https://www.bilibili.com/video/av19141078/?spm_id_from=333.788.b_636f6d6d656e74.6 2. 讲解 ...