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)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?
-
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android :id/tabhost"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- android:id="@android :id/tabs"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="0"/>
-
- android:id="@android :id/tabcontent"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="0"/>
-
- android:id="@+id/realtabcontent"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"/>
-
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android :id/tabhost"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- android:id="@android:id/tabcontent"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="0"/>
-
- android:id="@+id/realtabcontent"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"/>
-
- android:id="@android:id/tabs"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="0"/>
理論的には、上のレイアウトを修正するとtabのbuttonの下を実現することができます.
[html]
view plaincopyprint?
レイアウトを変更した後、私が間違っていることに気づき、変化がないことを示し、最終的に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