大部分APP的主界面都很类似,要么底部导航的,要么就是侧滑菜单,还有底部导航+侧滑菜单的;底部导航实现大概有几种方式:

  • TabHost+Fragment
  • RadioGroup+Fragment
  • FragmentTabHost+Fragment
  • BottomNavigator+Fragment

今天说一下FragmentTabHost+Fragment实现方式(布局文件在最下面):

1、定义一个TabBean,存放每个tab;

public class TabBean {
private int title; // 文字
private int icon; // 图标
private Class fragment; // 对应fragment public TabBean(Class fragment, int title, int icon ) {
this.title = title;
this.icon = icon;
this.fragment = fragment;
} public int getTitle() {
return title;
} public void setTitle(int title) {
this.title = title;
} public int getIcon() {
return icon;
} public void setIcon(int icon) {
this.icon = icon;
} public Class getFragment() {
return fragment;
} public void setFragment(Class fragment) {
this.fragment = fragment;
}
}

2、初始化数据集合

  private List<TabBean> mTabs = null;
private void initData() {
mTabs = new ArrayList();
mTabs.add(new TabBean(HomeFragment.class,R.string.home,R.mipmap.ic_launcher_round));
mTabs.add(new TabBean(HotFragment.class,R.string.hot,R.mipmap.ic_launcher_round));
mTabs.add(new TabBean(CategoryFragment.class,R.string.category,R.mipmap.ic_launcher_round));
mTabs.add(new TabBean(CartFragment.class,R.string.cart,R.mipmap.ic_launcher_round));
mTabs.add(new TabBean(MineFragment.class,R.string.mine,R.mipmap.ic_launcher_round));
}

3、实例化控件,设置数据;

    private void initView() {
mTabHost.setup(this,getSupportFragmentManager(),R.id.flContent); for(TabBean tab : mTabs){
TabHost.TabSpec tabSpec = mTabHost.newTabSpec(getString(tab.getTitle()));
tabSpec.setIndicator(buildIndicator(tab));
tabSpec.setContent(new TabHost.TabContentFactory() {
@Override
public View createTabContent(String s) {
return new View(MainActivity.this);
}
});
mTabHost.addTab(tabSpec,tab.getFragment(),null);
} mTabHost.setCurrentTab(0); //默认选中 mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabTitle) {
//修改选中Tab的样式(类似状态选择器)
TabWidget tabw = mTabHost.getTabWidget();
for (int i = 0; i < tabw.getChildCount(); i++) {
View view = tabw.getChildAt(i);
TextView tv = (TextView) view.findViewById(R.id.tab_title);
if (i == mTabHost.getCurrentTab()) {
tv.setTextColor(getResources().getColor(R.color.colorAccent));
} else {
tv.setTextColor(getResources().getColor(R.color.textColor));
} }
}
});
}
//构建Indicator
private View buildIndicator(TabBean tab){
View view = LayoutInflater.from(this).inflate(R.layout.tab_indicator,null);
ImageView img = (ImageView) view.findViewById(R.id.tab_icon);
TextView text = (TextView) view.findViewById(R.id.tab_title);
img.setBackgroundResource(tab.getIcon());
text.setText(tab.getTitle());
return view;
}

完成了!!! 下面是布局文件(界面的和tab的)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <FrameLayout
android:id="@+id/flContent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"></FrameLayout> <android.support.v4.app.FragmentTabHost
android:id="@+id/tabHost"
android:layout_width="match_parent"
android:layout_height="48dp">
</android.support.v4.app.FragmentTabHost>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:descendantFocusability="afterDescendants"
android:paddingBottom="4dp"
android:paddingTop="6dp"> <ImageView
android:id="@+id/tab_icon"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_centerHorizontal="true"
tools:ignore="ContentDescription" /> <TextView
android:id="@+id/tab_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tab_icon"
android:layout_centerHorizontal="true"
android:clickable="false"
android:enabled="false"
android:focusable="false"
android:gravity="center"
android:textColor="@color/textColor"
android:textSize="12sp"
tools:text="tab" /> </RelativeLayout>

FragmentTabHost这个控件每次切换Fragment,都会走Fragment的onCreateView和onDestroyView方法,多以每次切换都会创建和销毁Fragment实例,下篇文章说一下自定义FragmentTabHost避免重复创建和销毁Fragment实例,让Fragment隐藏hide和显示show;FragmentTabHost切换Fragment时保存状态,避免切换Fragment走onCreateView和onDestroyView方法;

Android控件使用FragmentTabHost,切换Fragment;的更多相关文章

  1. Android控件Gridview实现仿支付宝首页,Fragment底部按钮切换和登录圆形头像

    此案例主要讲的是Android控件Gridview(九宫格)完美实现仿支付宝首页,包含添加和删除功能:Fragment底部按钮切换的效果,包含四个模块,登录页面圆形头像等,一个小项目的初始布局. 效果 ...

  2. Android控件Gridview实现多个menu模块,可添加可删除

    此案例主要讲的是Android控件Gridview(九宫格)完美实现仿支付宝首页,包含添加和删除功能:Fragment底部按钮切换的效果,包含四个模块,登录页面圆形头像等,一个小项目的初始布局. 效果 ...

  3. 让多个Fragment 切换时不重新实例化、FragmentTabHost切换Fragment时避免UI重新加载

    http://www.tuicool.com/articles/FJ7VBb FragmentTabHost切换Fragment时避免UI重新加载 不过,初次实现时发现有个缺陷,每次FragmentT ...

  4. android控件的属性

    android控件的属性 本节描述android空间的位置,内容等相关属性及属性的含义 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 ( ...

  5. Android控件之ImageSwticher

    Android控件之ImageSwticher 1. ImageSwticher介绍 ImageSwitcher是图片切换的控件,它能实现图片切换时的动画效果,包括图片导入效果.图片消失效果等等.An ...

  6. [Android Pro] android控件ListView顶部或者底部也显示分割线

    reference to  :  http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...

  7. Android 控件架构及View、ViewGroup的测量

    附录:示例代码地址 控件在Android开发的过程中是必不可少的,无论是我们在使用系统控件还是自定义的控件.下面我们将讲解一下Android的控件架构,以及如何实现自定义控件. 1.Android控件 ...

  8. Android - 控件android:ems属性

    Android - 控件android:ems属性http://blog.csdn.net/caroline_wendy/article/details/41684255?utm_source=tui ...

  9. Android 控件知识点,

    一.Android控件具有visibility属性,可以取三个值:visible(默认值)可见,invisible(不可见,但仍然占据原有的位置和大小,可以看做是变得透明了),gone(空间不仅不可见 ...

随机推荐

  1. h5手机点击返回键,刷新页面

    在js中,加上一下代码: window.onpageshow = function(event) {if (event.persisted) {window.location.reload();}};

  2. cocos2d-x学习笔记(斗地主代码)

    满足百度百科上的出牌规则,电脑可以随着玩家出牌. 百度网盘地址:链接: https://pan.baidu.com/s/1eRLpvJ8 提取密码: tf8w

  3. 关于Excel导出实例(适合新手,比较详细)

    需要源代码的可以加我微信好友gqljxg1514 1,首先配置依赖pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  4. 解决Fiddler查看Post参数中文乱码的问题

    解决Fiddler查看Post参数中文乱码的问题 解决方法: 1.win+R 2.打开注册表编辑器:输入regedit +回车+是 3.HKEY_CURRENT_USER\Software\Micro ...

  5. ArcGIS 按多边形区域统计栅格影像的一些信息

    在使用ArcGIS对栅格影像进行分析时,难免要进行一些统计类的分析.如统计框选区域的像素的个数,面积.均值等内容. 下面给出使用“Spatial Analyst Tools -- > Zonal ...

  6. gitlab 同步小脚本

    gitlab 是公司中的代码仓库,如何保证两台机器同步呢 公司中使用的是docker那么久使用docker进行演示了也方便以后的工作查找资料 附:脚本 #!/bin/bash docker stop ...

  7. jquery移除元素时会自动解绑事件

    .html() When .html() is used to set an element's content, any content that was in that element is co ...

  8. 百度地图 JavaScript API

    最近有点懒  项目结尾了  完了好长时间 没有去总结项目中的问题 想了下还是写写吧 这是一个关于百度地图的 网页展示 <!DOCTYPE html><html><head ...

  9. hibernate模拟(转载)

    package simulation; /** * * @author Administrator * */ public class User { private int id; private S ...

  10. The Twelve-Factor Container

    转自:https://medium.com/notbinary/the-twelve-factor-container-8d1edc2a49d4?%24identity_id=550978996201 ...