Fragment和FragmentActivity的使用方法 .
认识:首先我们知道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。
public class MainTabActivity extends Activity { private TabHost mHost; // 在Activity中使用Tabhost必须要有LocalActivityManager物件来设定 LocalActivityManager lam; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // main layout採用预设的Tabhost mHost = (TabHost) findViewById(android.R.id.tabhost); lam = new LocalActivityManager(MainTabActivity.this, false); lam.dispatchCreate(savedInstanceState); mHost.setup(lam); mHost.addTab(mHost.newTabSpec("Tab1").setIndicator("Tab1").setContent(new Intent(MainTabActivity.this, FragmentActivity1.class))); mHost.addTab(mHost.newTabSpec("Tab2").setIndicator("Tab2").setContent(new Intent(MainTabActivity.this, FragmentActivity2.class))); } @Override protected void onPause() { // 漏掉这行一定出错 lam.dispatchPause(isFinishing()); super.onPause(); } @Override protected void onResume() { // 漏掉这行一定出错 lam.dispatchResume(); super.onResume(); } }
FragmentActivity1.java : 第一个Tab中用来管理Fragment的FragmentActivity。(2012-05-07更新)经由Jay留言后,小蛙详细测了一下,发现FragmentActivity主画面中的Button是没办法消失的(因为FragmentActivity的目的关系),因此改成这样,让FragmentActivity纯粹当成容器,主要的内容还是以Fragment为主。(这个方法不是唯一,但是一个可行的方法,应该也有更好的做法!)
public class FragmentActivity1 extends FragmentActivity { public static FragmentManager fm; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_activity_1); fm = getSupportFragmentManager(); // 只当容器,主要内容已Fragment呈现 initFragment(new Fragment1()); } // 切换Fragment public static void changeFragment(Fragment f){ changeFragment(f, false); } // 初始化Fragment(FragmentActivity中呼叫) public static void initFragment(Fragment f){ changeFragment(f, true); } private static void changeFragment(Fragment f, boolean init){ FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.simple_fragment, f); if(!init) ft.addToBackStack(null); ft.commit(); } }
Fragment1.java : 真正使用到的Fragment。
public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_1, container, false); Button tv = (Button)v.findViewById(R.id.button2); tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 直接呼叫FragmentActivity1的静态方法来做切换 FragmentActivity1.changeFragment(new Fragment2()); } }); return v; } }
fragment_acitivity_1.xml : FragmentActivity layout。(2012-05-07修改) FragmentActivity只用来当容器,而不真正呈现内容(仅把Fragment内容载入)。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:> </LinearLayout>
fragment1.xml:Fragment layout,FragmentActivity载入的真正内容。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </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
最后更新:2017-04-02 16:47:42
上一篇:
Java:使用内部类实现类的多重继承
下一篇:
JavaMail学习笔记(二)、JavaMail API简介和配置开发环境
C# WinForm多线程开发(三) Control.Invoke
acid
全国仅四家!阿里云ET城市大脑入选国家AI开放创新平台
安卓老大:三星占46%的安卓市场份额
springmvc4 mybatis 整合 框架源码 bootstrap html5 mysql oracle sqlsever spring SSM
Java之dead code——无用代码
《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一2.1.3 使用容量规划工具
Java学习路线图,专为新手定制的学习计划建议
首款基于 DynamIQ 的高性能 嵌入式处理器Cortex-A75
怎样做好一个产品之用户体验