二月 292012
 

(2013-01-30 更新) 接續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;
   [email protected]
    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:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:id="@+id/simple_fragment">
</LinearLayout>

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />
</LinearLayout>

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

2013-01-30 許多網友反應無法下載 MediaFire 的檔案,補上新連結。範例檔下載

2012-10-22 範例檔下載

相關文章

Android Vuforia with jPCT-AE (5) – 多重模型載入,以 obj 為例

要進到這系列最後一篇文章了,這篇文章拖了很久,一直沒有時間整理,結果到最後 ... 程式碼留下來了,記憶卻有些模糊了,這邊小蛙配著程式碼盡可能的把還記得的東西寫下來。
2016-07-06 11:24:19
hans

18

Android Vuforia with jPCT-AE (4) – 載入 3DS 測試

延續 jPCT-AE Loader 載入模型的部份,這篇要記錄載入 3ds 檔案格式的方法,基本上跟前面幾個 obj, md2 的方法差不多,只有一些小小的變化而已。
2016-07-06 10:24:33
hans

18

Android Vuforia with jPCT-AE (3) – 載入 md2 測試

前兩篇介紹如何直接透過 jPCT-AE 直接繪圖以及載入 .obj 檔案,這邊繼續介紹 jPCT-AE 載入 md2 的方法,載入動作大致上類似,唯一不同的只有 texture 設定部份。
2016-07-06 09:24:43
hans

18

Android Vuforia with jPCT-AE (2) – 載入 obj 測試

上一篇 Android Vuforia with jPCT-AE (1) –
2016-07-06 08:24:55
hans

18

Android Vuforia with jPCT-AE (1) – 基本範例

說來慚愧,從 Google Adsense 被 ban 之後,就好久沒有發文了,站上 Vuforia 的文章也已經是好久以前的事情了 (遠目),最近有專案要用到 Vuforia,爬以前的文回來看,蛙哩咧 ... 現在已經更新到 Vu
2016-07-06 07:57:58
hans

18

org.apache.jasper.JasperException : Expecting “jsp:param" standard action with “name" and “value" attributes

今天遇到一個很有趣的問題,有個系統要從舊的環境移到新的環境,在程式碼沒有變動的情況下,新環境會出現這個錯誤,由於舊的環境 JDK 跟 Tomcat 真的是太舊了,會有這些錯誤不意外,環境不一致所造成的不相容也只好慢慢修掉。
2012-10-02 09:50:48
hans

18

Android TabHost中切換Activity

(2013-04-15 更新)上一篇文章Android TabHost Without TabActivity
2012-02-25 15:03:29
hans

18

Android TabHost Without TabActivity

2012-02-25 13:47:50
hans

18

Google AdWhirl with Vpon

(2012-07-20 更新)前面幾篇小蛙陸續介紹了Google AdWhirl串接kuAD, AdMob,以及單獨使用AdMob(單獨使用Vpon或kuAD只要直接下載匯入範例就可以囉!),今天要來記錄
2012-01-08 20:21:03
hans

18

Google AdWhirl with kuAD

(2012-04-06 更新)接續上一篇,小蛙繼續記錄使用Google AdWhirl銜接kuAD,kuAD是由kuSOGI
2012-01-07 16:21:10
hans

18




  21 則留言 to “Android Tabhost with FragmentActivity”

  1. 多谢lz,tab实现的方式茫茫多,得每种都研究研究找到最适合自己需求的实现方式

  2. LocalActivityManager现在是个过期的类,不太想使用它,而TabHost直接用setup()方法会报错,看了网上其他的解决办法没能很好的解决,不知道版主有没有考虑过这个问题

  3. hi 非常感谢LZ共享这个方法,很实用。不过有个问题,一直没解决,请LZ帮忙看下,
    我在其中一个FRAGMENT中的 onCreateView 里调用了 startActivityForResult
    Intent securityIntent = new Intent(layoutView.getContext(),
    SecurityCheckActivity.class)
    startActivityForResult(securityIntent, SecurityCheckRequestCode);
    可是怎么都接收不到 onActivityResult事件,请问要怎么处理?

    • Dear dean:

      在 Fragment 下是沒有辦法接收到 startActivityForResult 結果的喔!
      把 startActivityForResult(securityIntent, SecurityCheckRequestCode);
      改成
      getActivity().getParent().startActivityForResult(securityIntent, SecurityCheckRequestCode);
      透過 MainTabActivity 來呼叫 startActivityForResult,
      同時也要使用 MainTabActivity 的 onActivityResult 來處理這個事件!
      Good Luck !!

 回覆

你可以使用以下語法 HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="">

(required)

(required)

   
© 2012 蛙齋 Suffusion theme by Sayontan Sinha