1.布局文件的写法
布局文件包括activity_main(主页界面),tab_indicator(每一个底部菜的布局),fragment_home,fragment_cart,fragment_hot,fragment_mine以及四个不同页面的布局
activity_main布局文件十分简单,可以是一个简单的LinearLayout(线性布局)中添加FragmentTabHost控件即可。
这里有两个FramLayout控件,其中用+id命名为realtabcontent的FramLayout控件为之后要用到的FramLayout,另一个FramLayout没有实际作用,仅仅只是FragmentTabHost控件的规定写法而已。
tab_indicator的布局
fragment_home,fragment_cart,fragment_hot,fragment_mine的简单布局文件,这四个文件只有显示文字不同以作标示。此处只展示fragment_mine的源码。
2.主要代码
布局好FragmentTabHost控件后,在mainActivity中获取该控件并调用它的setup()方法,setup方法需要传入三个参数,例如:
mTabhost.setup(this,getSupportFragmentManager(),R.id.realtabcontent);
nainActivity源码如下:
public class MainActivity extends AppCompatActivity {
private FragmentTabHost mTabhost; //获取FragmentTabHost控件
private LayoutInflater mInflater; //获取view需要一个LayoutInflater类型变量
private List mTabs= new ArrayList<>(4);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initTab();
}
private void initTab() { //对Fragment的数据填充进行封装处理
mTabhost=this.findViewById(android.R.id.tabhost);
mInflater=LayoutInflater.from(this); //初始化变量mInflater
mTabhost.setup(this,getSupportFragmentManager(),R.id.realtabcontent); //调用setup方法,其中第3个参数为动态切换页面的布局空间
Tab tab_home=new Tab(R.string.home,R.mipmap.home,HomeFragment.class);
Tab tab_cart=new Tab(R.string.cart,R.mipmap.cart, CartFragment.class);
Tab tab_hot=new Tab(R.string.hot,R.mipmap.hot, HotFragment.class);
Tab tab_mine=new Tab(R.string.mine,R.mipmap.mine, MineFragment.class);
mTabs.add(tab_home);
mTabs.add(tab_cart);
mTabs.add(tab_hot);
mTabs.add(tab_mine);
for (Tab tab: mTabs){ //该for循环表示从mTabs组中依次取出Tab类型的对象进行循环
TabHost.TabSpec tabSpec=mTabhost.newTabSpec(getString(tab.getString()));
tabSpec.setIndicator(bulidIndicator(tab));
mTabhost.addTab(tabSpec, tab.getFragment(),null);
}
mTabhost.getTabWidget().setShowDividers(LinearLayout.SHOW_DIVIDER_NONE);//消除分割线
}
private View bulidIndicator(Tab tab){ //封装返回view
View view=mInflater.inflate(R.layout.tab_indicator,null);
ImageView img=view.findViewById(R.id.tab_icon);
TextView txt=view.findViewById(R.id.txt_indicator);
img.setBackgroundResource(tab.getImg());
txt.setText(tab.getString()); //赋值图片和文字
return view;
}
}
其中Tab类为自定义的类,包括需要动态变化的三个数据,分别是底部导航栏的图片,文字以及导航的fragment页面。
Tab类如下:(alt+ins可以一键生成get set方法)
public class Tab {
private int string;
private int img;
private Class fragment;
public Tab(int string, int img, Class fragment) {
this.string = string;
this.img = img;
this.fragment = fragment;
}
public void setString(int string) {
this.string = string;
}
public void setImg(int img) {
this.img = img;
}
public void setFragment(Class fragment) {
this.fragment = fragment;
}
public int getString() {
return string;
}
public int getImg() {
return img;
}
public Class getFragment() {
return fragment;
}
}
Tab数据类中Fragment是一个class文件,需要继承Fragment,其源码如下:
public class CartFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_cart,container,false);
}
}



