FragmentTabHost,一个很常用的控件。初次接触时,在GOOGLE上找了一些博客,看了些例子,被复杂的结构和很多没接触过的函数弄晕了头。所以自己尝试在那些例子上简化一些,只做FragmentTabHost 最基本的界面功能。
FragmentTabHost继承的机构
↳android.support.v4.app.FragmentTabHost
一、项目效果
二、项目结构图
三、Main.Xml
FragmentTabHost本身是一个控件,而不是Activity。这个Main.xml是整个Activity需要的。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- android.support.v4.app.FragmentTabHost 来自android.support.v4.jar的扩展包--> <android.support.v4.app.FragmentTabHost android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="wrap_content" > <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="0" /> </android.support.v4.app.FragmentTabHost> <!-- 这个 FrameLayou和上一个 FragmentTabHost 在 xml的位置决定了 界面里 Tab的位置是在上面的 --> <FrameLayout android:id="@+id/realtabcontent" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" /> </LinearLayout>
四、三个 Fragment 的界面(这里之贴出一个,另外两个和这个一样。)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第一个Fragment" android:textSize="30sp"/> </LinearLayout>
五、主Activity,MainTabActivity.java:
package com.example.thealarmclock; import com.example.tabhost.FirstFragment; import com.example.tabhost.SecondFragment; import com.example.tabhost.ThreeFragment; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTabHost; import android.view.Window; import android.widget.TabHost.TabSpec; public class MainActivity extends FragmentActivity { /** * 定义一个 FragmentTabHost */ private FragmentTabHost mTabHost = null; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.layout_main); // FragmentTabHost的setup方法 // public void setup (Context context, FragmentManager manager, int // containerId) mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); // 这里需要传人的是是Fragment对应的id,getSupportFragmentManager()的方法返回一个FragmentManager /* * newTabSper传入的参数是String类型的,作用是标签。 setIndicator有三个复写函数 * * setIndicator(CharSequence label) 指定 "标签" 作为 选项卡的指示器, * setIndicator(View view) 指定 一个 View 作为 选项卡的指示器 * setIndicator(CharSequence label, Drawable icon) 同时指定 标签和 图标 作为 * 选项卡的指示器。 * * 这里为了更简单,我只传入了 一个文本。 * * addTab传人的三个参数, addTab(TabHost.TabSpec tabSpec, Class<?> clss, * Bundleargs) */ TabSpec tabSpec = mTabHost.newTabSpec("alarmClock").setIndicator("闹钟"); mTabHost.addTab(tabSpec, FirstFragment.class, null); tabSpec = mTabHost.newTabSpec("stopWatch").setIndicator("秒表"); mTabHost.addTab(tabSpec, SecondFragment.class, null); tabSpec = mTabHost.newTabSpec("timer").setIndicator("计时器"); mTabHost.addTab(tabSpec, ThreeFragment.class, null); } protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); // 把mTabHost赋值为null。 mTabHost = null; } }
六、Fragment的界面对应的java FirstFragment.java(另外两个和这个一样。)
package com.example.tabhost; import com.example.thealarmclock.R; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class FirstFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //fragment_1,这个java对应的布局文件 return inflater.inflate(R.layout.fragment_1, null); } }