選択 モバイル版に入る | PC版を継続
Android開発に助かるApkSchool版主募集中DISCUZ!X3.1 Japanese Version提供
表示: 3101|返信: 0

Android UI篇 FragmentTabHost

[リンクをコピー]
发表于 2013-6-16 01:31:37 | 显示全部楼层 |阅读模式
webhostingpad
この記事は最後 niuxs より 2013-6-16 01:44 編集された

FragmentTabHostとは、
FragmentTabHost は Fragment をタブで切り替えるための View です。
Android 1.6 から使用することができます。
Activity にタブを表示して View を切り替える実装は以前は TabActivity を使っていましたが、
現在は非推奨になっています。

FragmentTabHost の使いかたを説明します。
main_linear.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >

  6. <FrameLayout
  7. android:id="@+id/realtabcontent"
  8. android:layout_width="match_parent"
  9. android:layout_height="0dip"
  10. android:layout_weight="1" />

  11. <android.support.v4.app.FragmentTabHost
  12. android:id="@android:id/tabhost"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content" >

  15. <TabWidget
  16. android:id="@android:id/tabs"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:orientation="horizontal" />

  20. </android.support.v4.app.FragmentTabHost>

  21. </LinearLayout>
コードコピー
次に Activity の実装です。Fragment を取り扱うので FragmentActivity を継承します。
onCreate() で FragmentTabHost を findViewById() で参照し FragmentTabHost#setup()
メソッドを呼びます。引数には Context と FragmentManager を渡さなければいけないので
FragmentActivity#getSupportFragmentManager() で取得した FragmentManager を渡すようにします。
  1. mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
  2. mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
コードコピー
あとはタブの情報である TabSpec で作っていきます。TabSpec のインスタンスは
FragmentTabHost#newTabSpec() で生成します。引数には TabSpec のタグを渡します。
必ず設定しておかなければいけないのが TabSpec#setIndicator() です。
これはタブの View になります。String を渡すとデフォルトのタブボタンの View が使われます。
最後に FragmentTabHost#addTab() でタブを追加します。第一引数に TabSpec を、
第二引数にタブが選択されたときに表示したい Fragment を Class で渡します。
第三引数には Fragment で読み込みたいデータを Bundle で渡します。
特に必要ない場合は null でOKです。
  1. View indicator = getIndicatorView(i);
  2. TabSpec tabSpec = mTabHost.newTabSpec(TabTag[i]);
  3. tabSpec.setIndicator(indicator);
  4. Bundle bundle = new Bundle();
  5. bundle.putString("name", TabTag[i]);
  6. mTabHost.addTab(tabSpec, TestFragmentPage.class, bundle);
コードコピー
FragmentTabHostActivity.java
  1. package net.apkschool.edu;

  2. import junit.framework.Assert;
  3. import android.os.Bundle;
  4. import android.support.v4.app.Fragment;
  5. import android.support.v4.app.FragmentActivity;
  6. import android.support.v4.app.FragmentTabHost;
  7. import android.util.Log;
  8. import android.view.Gravity;
  9. import android.view.LayoutInflater;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.widget.TabHost.TabSpec;
  13. import android.widget.TextView;

  14. public class FragmentTabHostActivity extends FragmentActivity {

  15. private FragmentTabHost mTabHost;

  16. private String[] TabTag = {"tab1", "tab2", "tab3", "tab4", "tab5"};
  17. private String[] IndicatorTxt = {"HP", "News", "コメント", "推薦", "更に"};

  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main_linear);

  22. Assert.assertEquals(TabTag.length, IndicatorTxt.length);
  23. mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
  24. mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

  25. for (int i=0; i < IndicatorTxt.length; i++){
  26. View indicator = getIndicatorView(i);
  27. TabSpec tabSpec = mTabHost.newTabSpec(TabTag[i]);
  28. tabSpec.setIndicator(indicator);
  29. Bundle bundle = new Bundle();
  30. bundle.putString("name", TabTag[i]);
  31. mTabHost.addTab(tabSpec, TestFragmentPage.class, bundle);
  32. Log.d("tabSpec = ", TabTag[i]);
  33. }

  34. //TabWidget tabWidget = (TabWidget)findViewById(android.R.id.tabs);
  35. //tabWidget.setBackgroundResource(R.drawable.bg10);
  36. }

  37. private View getIndicatorView(int i){
  38. View v = getLayoutInflater().inflate(R.layout.tab_indicator_1, null);
  39. TextView tv = (TextView)v.findViewById(R.id.textView1);
  40. tv.setText(this.IndicatorTxt[i]);
  41. return v;
  42. }
  43. }
コードコピー
タブの切り替えはよく使われる UI のひとつですが、
Fragment を使うととても管理しやすいです。何より以前良く使われていた TabActivity の
実装方法は非推奨になっているので、これからは FragmentTabHost を使うようにしましょう。
Support Package で導入されてから Fragment を使う機会がかなり増えてきます。
Android 開発者にとって Fragment を使いこなすことは必須と言えます。




この記事に更なる添付があります

貴方は ログイン 後、ダウンロード・閲覧が可能となる,アカウントない?直ぐ登録

x
返信

道具使用 レポート

返信は先にログインが必要 ログイン | 直ぐ登録

フォーラム点数規則

フリーランス

モバイル版|APK School Net  

GMT+8, 2017-12-12 06:46 , Processed in 0.172723 second(s), 25 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速返信 トップへ リストへ