FragmentTabHost
联合Fragment
可以方便的实现导航页面模式。
下面再代码中简介:
activity.xml
"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
"@+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
"@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#33b5e5"
>
fragment.xml
"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#6998bb"
android:orientation="vertical">
其中一个Fragment.java示例,其它都一样
public class Fragment1 extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tabpager1,container,false);
}
}
activity.java
public class HomeActivity extends FragmentActivity {
private FragmentTabHost mFragmentTabHost;
private FrameLayout container;
private String[] tabTitles;
private Class[] fragments;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
initView();
}
private void initView() {
mFragmentTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
//相当于是初始化FragmentTabHost,重要参数就是FragmentManager了,它用于后面自动创建Fragment
//第三个参数如果不指定的话,它将用自带的容器来装页面
mFragmentTabHost.setup(this,getSupportFragmentManager(),R.id.container);
container = (FrameLayout) findViewById(R.id.container);
tabTitles = new String[]{"附近", "热门", "探索", "我的"};
//创建一个Fragment集合
fragments = new Class[]{Fragment1.class, Fragment2.class, Fragment3.class, Fragment4.class};
for (int i = 0; i < fragments.length; i++) {
//创建导航标签
TabHost.TabSpec tabSpec = mFragmentTabHost
//获得一个TabSpec,参数它的标签,
// 通过调用mFragmentTabHost.getCurrentTabTag()可以获得当前标签
.newTabSpec(tabTitles[i])
//指定一个View作为该Tab的指示器,这个View可以是任意的
.setIndicator(getIndicator(i));
//为FragmentTabHost添加一个Fragment,它可以根据类名自动创建Fragment,
//最后一个参数Bundle是被FragmentTabHost内部的TabInfo所持有的,
//当然与TabSpec对应的Fragment的tag就是该TagSpec的tag
mFragmentTabHost.addTab(tabSpec, fragments[i], null);
//通过这个方法可以获得对应位置的Tab的View,然后给他设置背景选择器
mFragmentTabHost.getTabWidget().getChildAt(i)
.setBackgroundResource(R.drawable.selector_tab_background);
//这个方法可以设置分隔线,null为没有分隔线
mFragmentTabHost.getTabWidget().setDividerDrawable(null);
}
}
/**
* 获取背景选择器
* @param position tab的位置
* @return
*/
private View getIndicator(int position) {
View view = LayoutInflater.from(this).inflate(R.layout.item_tab, null);
ImageView imageView = (ImageView) view.findViewById(R.id.iv_tabImage);
imageView.setImageResource(R.drawable.cat);
TextView textView = (TextView) view.findViewById(R.id.tv_tabTitle);
textView.setText(tabTitles[position]);
return view;
}
}