Tabインタフェース実装の要約と比較

8654 ワード

TabレイアウトはiOSの定番レイアウトで、Androidアプリケーションにも多くのアプリケーションがあり、AndroidにおけるTAbの実現についても前述したように、『Android UI開発第18編——Activity Group実現tab機能』である.この文章はいくつかのTabの実現をまとめた.
 
1)TabActivityから継承され、TabActivityはAPI Level 13では推奨されていないが、すべての著者は新開発のアプリケーションでTabActivityを使用することを提案していない.Tabactivityに関するいくつかの分析は「Android TabActivityの感嘆、英雄暮路、美人辞暮、昔の英雄さよなら」を参考にすることができる.
 
2)Activityから継承され、レイアウトはTabHostを使用するが、これは実際には上のTabActivityと同様であり、ここでfindViewById()を使用してTabHostオブジェクトを取得し、TabActivityはgetTabHost()を使用してTabHostオブジェクトを取得するにすぎない.
 
3)Activity Groupを使用して、『Android UI開発第18編——Activity Group実現tab機能』で紹介されていますが、もちろん、以下のbuttonレイアウトではより多くの実装方法があり、皆さんも自分で拡張することができます.Activity GroupもAPI Level 13では推奨されていません.
 
4)ActionBarを使用するActionBar.NAVIGATION_MODE_TABSモード、ActionBarの追加ナビゲーションオプションタブを参照して説明します.ActionBarはAndroid 3.0以降に登場したもので、より多くのAndroidバージョンに対応するために、『Android UI開発第35編——AppCompat実装ActionBar』を参考にすることができます.
 
5)FragmentActivityから継承し、FragmentTabHostを使用する.具体的なインプリメンテーションはFragmentTabHostを参照することができる.もちろんFragmentから直接継承し、FragmentTabHostを使用することもできます.
 
6)より高度なTabインタフェースを作ることができ、ジェスチャーがスライドするTabは、『Creating Swipe Views With Tabs』を参照する.ジェスチャースライド切替Tabは、ViewPageを用いて単独で実現することができる.
 
7)Tabインタフェースを実現する方法はいろいろありますが、開発者ごとに異なる方法があるかもしれません.特にTabの下のButtonに対処するには、開発者はいろいろカスタマイズできます.Buttonを使って実現したものもImageViewを使って実現したものもあれば、RadioButtonを実現したものもあれば、混在レイアウトを実現したものもあります.これらは開発者の想像力を十分に発揮することができます.
 
TabActivityが期限切れになってから、使用をお勧めしません.多くの開発者は元のTabActivityをFragmentTabHostに変更しようとしていますが、公式に提供された方法ではTabのbuttonを下に置くことはできません.
 
[html] view plaincopyprint?
  1.     xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:id="@android :id/tabhost"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent">  
  5.   
  6.     
  7.         android:orientation="vertical"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent">  
  10.   
  11.         
  12.             android:id="@android :id/tabs"  
  13.             android:orientation="horizontal"  
  14.             android:layout_width="match_parent"  
  15.             android:layout_height="wrap_content"  
  16.             android:layout_weight="0"/>  
  17.   
  18.         
  19.             android:id="@android :id/tabcontent"  
  20.             android:layout_width="0dp"  
  21.             android:layout_height="0dp"  
  22.             android:layout_weight="0"/>  
  23.   
  24.         
  25.             android:id="@+id/realtabcontent"  
  26.             android:layout_width="match_parent"  
  27.             android:layout_height="0dp"  
  28.             android:layout_weight="1"/>  
  29.   
  30.       
  31.   

  32. 理論的には、上のレイアウトを修正するとtabのbuttonの下を実現することができます.
     
     
    [html]
     view plaincopyprint?  
  33.     xmlns:android="http://schemas.android.com/apk/res/android"  
  34.     android:id="@android :id/tabhost"  
  35.     android:layout_width="match_parent"  
  36.     android:layout_height="match_parent">  
  37.     
  38.         android:orientation="vertical"  
  39.         android:layout_width="match_parent"  
  40.         android:layout_height="match_parent">    
  41.         
  42.             android:id="@android:id/tabcontent"  
  43.             android:layout_width="0dp"  
  44.             android:layout_height="0dp"  
  45.             android:layout_weight="0"/>  
  46.         
  47.             android:id="@+id/realtabcontent"  
  48.             android:layout_width="match_parent"  
  49.             android:layout_height="0dp"  
  50.             android:layout_weight="1"/>  
  51.   
  52.             android:id="@android:id/tabs"  
  53.             android:orientation="horizontal"  
  54.             android:layout_width="match_parent"  
  55.             android:layout_height="wrap_content"  
  56.             android:layout_weight="0"/>  
  57.   
  58.       
  59.   

  60. レイアウトを変更した後、私が間違っていることに気づき、変化がないことを示し、最終的にFragmentTabHostのバグであることに気づいた.参考にする.
     
     
    I change TabWidget down, but it will never be used xml in FragmentTabHost.
    
    I search Bug in support.v4 library:
    Copy FragmentTabHost.java to your own project and Comment line 153 to 175 or change initFragmentTabHost:

     private void initFragmentTabHost(Context context, AttributeSet attrs) {
            TypedArray a = context.obtainStyledAttributes(attrs,
                    new int[] { android.R.attr.inflatedId }, 0, 0);
            mContainerId = a.getResourceId(0, 0);
            a.recycle();
    
            super.setOnTabChangedListener(this);
    
            // If owner hasn't made its own view hierarchy, then as a convenience
            // we will construct a standard one here.
    
    
    /***** HERE COMMENT CODE BECAUSE findViewById(android.R.id.tabs) EVERY TIME IS NULL WE HAVE OWN LAYOUT ******//
    
    
    //        if (findViewById(android.R.id.tabs) == null) {
    //            LinearLayout ll = new LinearLayout(context);
    //            ll.setOrientation(LinearLayout.VERTICAL);
    //            addView(ll, new FrameLayout.LayoutParams(
    //                    ViewGroup.LayoutParams.FILL_PARENT,
    //                    ViewGroup.LayoutParams.FILL_PARENT));
    //
    //            TabWidget tw = new TabWidget(context);
    //            tw.setId(android.R.id.tabs);
    //            tw.setOrientation(TabWidget.HORIZONTAL);
    //            ll.addView(tw, new LinearLayout.LayoutParams(
    //                    ViewGroup.LayoutParams.FILL_PARENT,
    //                    ViewGroup.LayoutParams.WRAP_CONTENT, 0));
    //
    //            FrameLayout fl = new FrameLayout(context);
    //            fl.setId(android.R.id.tabcontent);
    //            ll.addView(fl, new LinearLayout.LayoutParams(0, 0, 0));
    //
    //            mRealTabContent = fl = new FrameLayout(context);
    //            mRealTabContent.setId(mContainerId);
    //            ll.addView(fl, new LinearLayout.LayoutParams(
    //                    LinearLayout.LayoutParams.FILL_PARENT, 0, 1));
    //        }
        }

     
     
     
    これにより、FragmentTabHostを用いてTabインタフェースbuttonを実現することができないという問題が解決される.
     
     
    上述したTabインタフェースの実現方式は,結局2つの大きなクラスに分けられ,最初の3つは1つのクラスであり,我々は総称してOld Tabと呼ぶ.後の3つは1つで、私たちはNew Tabと呼ばれています.Old TabはActivityをロードでき、New TabはFragmentをロードします.この場合、彼らのライフサイクルは異なります.Old TabがロードしたActivityが再び戻ってきたのはonResumeからで、New TabがロードしたFragment(Fragmentのライフサイクル)が再び戻ってきたのはonCreateViewからです.
     
    Tabインタフェースを実現するのは上述しただけではなく、多くの開発者の創造力が無限であるため、レンガを投げて玉を引く効果を果たすことを望んでいる.
     
     
    /**
     
    *@author張興業
     
    *  http://blog.csdn.net/xyz_lmn
     
    *iOSエントリーグループ:83702688
    *android開発ステップ群:241395671
     
    *私の新浪微博:@張興業TBOW
     
    */
     
    参照先:
    http://developer.android.com/reference/android/support/v4/app/FragmentTabHost.html
    http://developer.android.com/training/implementing-navigation/lateral.html