1,创建XML
<?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">
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
<android.support.v4.app.FragmentTabHost
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
注意: 1,FragmentTabHost的id必须指定为android默认的控件id:tabhost。 2,Tab组件在上面或者下面,就看你的内容区域是怎么定义的了。 3,内容区必须设置layout_weight=”1”,对应的tab中也要设置layout_height=”wrap_content”,不然会发生显示不全哟。内容区这样设置的目的是让它自动的布满,但是不会覆盖掉Tab的内容。 4,FragmentTabHost在Xml中这样定义就可以了,不需要再多的控件。预览的时候你会发现预览不了,不用管就好了,就算你把它提示需要的东西全部添加上了,依旧会找茬- -如下~
2,Java中的实现
首先上一段最简单的实现方式,下面我再仔细的讲讲
public class MyTabHost extends FragmentActivity {
private FragmentTabHost tabHost;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.布局文件);
tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
tabHost.setup(
this, getSupportFragmentManager(), R.id.content);
tabHost.addTab(tabHost.newTabSpec(
"标签").setIndicator(
"视图(View)"),
".class(指向View的类)",
null);
}
}
注意: 1,首先定义出FragmentTabHost组件就不用讲了吧~ 2,调用tabHost的setup方法,源代码中提供了三个setup方法,如下 我们直接使用第三个(会了第三个其他俩个都不用讲了拉~),传入一个上下文对象,传入一个FragmentManager,传入一个更改内容的布局(就是上面id为content的FrameLayout) *用于我们这个类是extends的FragmentActivity(android.support.v4.app.FragmentActivity;) 所以传入的FragmentManager是getSupportFragmentManager()。 3,下方tabs的添加,调用addTab方法 你有几个tab就add几次~然后我们具体讲一下这个传入参数的问题
参数一 :重点关注这个 TabHost.TabSpec tabSpec参数
这个参数就是传入的你需要tab的View,源代码中提供了三个方法: 分别是: 1.仅设置一个标题; 2.设置一个标题和一个图标; 3.自定义一个View传入(可以理解成ListView一样) 前面俩个就不说了,讲讲第3个方法:
View view = getLayoutInflater()
.inflate(R
.layout.tabs控件你想要的布局自定义, null)
参数二 :Class
这里传入的是一个extends了Fragment的类。*.class 类当中就是内容区域具体显示的内容,与一些操作了~ 要注意的是:俩个类继承的Frament的包要是相同的 比如我这里继承的是android.support.v4.app.FragmentActivity; 那么内容中的类也必须是继承的android.support.v4.app.FragmentActivity;
参数三 :传个null 就好 = =
3,设置切换事件
TabHost中的内容切换不用管,这里涉及到的是tabs的点击事件。具体的内容切换是默认完成的,不需要再额外写什么。 需要考虑优化小狮子可以另外百度下吧~初级点的优化就是切换的Fragment中左下判断,判断View是否已经加载过了。高级点的优化就是重写FragmentTabHost中的切换事件了。具体可以百度一下~~~我就不逼逼了,这里主要不讲优化QAQ
tabHost.setOnTabChangedListener(
new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
tabId为上面设置的title值;
}
);
4,封装好的模块~ 有需要的可以复制过去改改图片资源就能跑起来了~
public class MyTabHost extends FragmentActivity {
private FragmentTabHost tabHost;
private String title[] = {
"标题一",
"标题二",
"标题三"};
private List<View> viewList;
private Class fragmentItem[] = {Fragment1.class, Fragment2.class, Fragment3.class};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_car);
initView();
initTabs();
listener();
}
private void initView() {
viewList =
new ArrayList<>();
for (
int i =
0; i < title.length; i++) {
View view = getLayoutInflater().inflate(R.layout.tabs,
null);
TextView textView = (TextView) view.findViewById(R.id.tabs_btn);
if(i ==
0){
textView.setTextColor(Color.WHITE);
textView.setBackgroundResource(R.drawable.tabs_visitor_on);
}
textView.setText(title[i]);
viewList.add(view);
}
}
private void initTabs() {
tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
tabHost.setup(
this, getSupportFragmentManager(), R.id.content);
for (
int i =
0; i < fragmentItem.length; i++) {
TabHost.TabSpec tabSpec = tabHost.newTabSpec(title[i]);
tabSpec.setIndicator(viewList.get(i));
tabHost.addTab(tabSpec, fragmentItem[i],
null);
}
}
private void listener() {
tabHost.setOnTabChangedListener(
new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
/**方法一*/
TabWidget tab = tabHost.getTabWidget();
for (
int i =
0 ; i < tab.getChildCount() ; i ++){
View view = tab.getChildAt(i);
TextView text = (TextView) view.findViewById(R.id.tabs_btn);
if(tabHost.getCurrentTab() == i){
text.setTextColor(Color.WHITE);
text.setBackgroundResource(R.drawable.tabs_visitor_on);
}
else{
text.setTextColor(Color.BLACK);
text.setBackgroundResource(R.drawable.tabs_visitor);
}
}
/**方法二*/
for(
int i =
0 ; i < title.length ; i ++){
View view = tabsView[i];
TextView text = (TextView) view.findViewById(R.id.tabs_btn);
if(tabId.equals(title[i])){
text.setBackgroundResource(R.drawable.tabs_visitor_on);
text.setTextColor(Color.WHITE);
}
else{
text.setBackgroundResource(R.drawable.tabs_visitor);
text.setTextColor(Color.BLACK);
}
}
}
});
}
}
整编文章下来有点啰嗦,感谢小狮子们的观看。如果有疑问或者建议,还请评论~
欢迎加我一起讨论~ Clay
QQ.2095204800
转载请注明原文地址: https://ju.6miu.com/read-674562.html