上海天局信息技术有限责任公司

网站首页 > 天局论坛 > Android > App

Fragment和FragmentActivity的使用方法 .

2017-12-12 14:46:56 上海天局信息技术有限责任公司 已读

认识:首先我们知道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.    

  12.         lam = new LocalActivityManager(MainTabActivity.thisfalse);  

  13.         lam.dispatchCreate(savedInstanceState);  

  14.    

  15.         mHost.setup(lam);  

  16.         mHost.addTab(mHost.newTabSpec("Tab1").setIndicator("Tab1").setContent(new Intent(MainTabActivity.this, FragmentActivity1.class)));  

  17.         mHost.addTab(mHost.newTabSpec("Tab2").setIndicator("Tab2").setContent(new Intent(MainTabActivity.this, FragmentActivity2.class)));  

  18.     }  

  19.     @Override  

  20.     protected void onPause() {  

  21.         // 漏掉這行一定出錯  

  22.         lam.dispatchPause(isFinishing());  

  23.         super.onPause();  

  24.     }  

  25.     @Override  

  26.     protected void onResume() {  

  27.         // 漏掉這行一定出錯  

  28.         lam.dispatchResume();  

  29.         super.onResume();  

  30.     }  

  31. }  


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的项目案例。
这个项目做的好像是一个电视节目提醒之类的东西,运行截图如下:
 图片关键词


Powered by MetInfo 5.3.17 ©2008-2022 www.metinfo.cn