Android开发:FragmentTabHost实现底部菜单栏

安卓从零开发之购物商城(一)--底部菜单栏的的实现(FragmentTabHost) 前言:最近计划学习一个商城项目进行开发练手,所以准备写写记录一下,加深一下理解。(一)商城的效果界面大概与主流的手机购物app类似,万地高楼平地起,所以第一步先进行主界面的搭建,这边文章先实现底部菜单栏。这篇文章最后的效果图应该是这样: 在这里这个功能主要是用FragmentTabHost和Selector选择器来实现; 有如下几个步骤: FragmentTabHost初始化必须调用s 阅读详情

之前的写项目的底部菜单栏是用FragmentTabHost嵌套Fragment来实现的,自己觉得这种实现方式也是比较简单的,感觉也还不错,下面咱们就来实现一下:

效果图:

11

 

接下来,我们就开始实现它吧~

1、在我们想要实现这种效果的Activity中来做我们的工作,一般都是主页面,我取得名字叫SecondActivity,看下这个类的代码:

/**
 * Created by Administrator on 2018/1/22.
 * 主页index,这里就是我的主页面了,取名SecondActivity 
 */

public class SecondActivity extends AppCompatActivity {
    /**
     *定义 FragmentTabhost
     */
    private FragmentTabHost mTabHost;

    /**
     * 布局填充器
     */
    private LayoutInflater mLayoutInflater;
    private ImageView iv_shopCar;
    private ImageView iv_main;
    private LinearLayout ll_search;
    

/**
 * Fragment数组界面,用Fragment做每一个菜单的对应显示页面,分别为Fragment1,
 * Fragment2,Fragment3,Fragment4
 */

    private Class mFragmentArray[] = {Fragment1.class, Fragment2.class,
            Fragment3.class, Fragment4.class};
    /**
     * 存放图片数组,用作菜单按钮的图片
     */
    private int mImageArray[] = {R.drawable.icon_about,
            R.drawable.icon_category_48,
            R.drawable.icon_about,
            R.drawable.icon_about};

    /**
     * 选修卡文字
     */
    private String mTextArray[] = {"首页", "分类", "购物车", "个人中心"};

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second_main);
        //秒杀倒计时,这个没用了,给注释了
//        CountdownView countdownView = findViewById(R.id.countdownView);
//        countdownView.start(9550000); // Millisecond
//        for (int time = 0; time < 1000; time++) {
//            countdownView.updateShow(time);
//        }

        initView();
    }

    /**
     * 初始化组件
     */
    private void initView() {
        mLayoutInflater = LayoutInflater.from(this);

        // 找到TabHost
        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
        // 得到fragment的个数
        int count = mFragmentArray.length;
        for (int i = 0; i < count; i++) {
            // 给每个Tab按钮设置图标、文字和内容
            TabHost.TabSpec tabSpec = mTabHost.newTabSpec(mTextArray[i])
                    .setIndicator(getTabItemView(i));
            // 将Tab按钮添加进Tab选项卡中
            mTabHost.addTab(tabSpec, mFragmentArray[i], null);
            // 设置Tab按钮的背景
            mTabHost.getTabWidget().getChildAt(i)
                    .setBackgroundColor(getResources().getColor(R.color.white_gray));

        }

//获取每个菜单对应的子view,然后通过菜单的子view来查找每个view中的控件id

        final View tab1 = mTabHost.getTabWidget().getChildTabViewAt(0);
        final View tab2 = mTabHost.getTabWidget().getChildTabViewAt(1);
        final View tab3 = mTabHost.getTabWidget().getChildTabViewAt(2);
        final View tab4 = mTabHost.getTabWidget().getChildTabViewAt(3);
        final TextView tv_1 = tab1.findViewById(R.id.textview);
        final TextView tv_2 = tab2.findViewById(R.id.textview);
        final TextView tv_3 = tab3.findViewById(R.id.textview);

        final TextView tv_4 = tab4.findViewById(R.id.textview);

//子菜单的点击事件

        tab1.setOnClickListener(new View.OnClickListener() {
            @Override

            public void onClick(View v) {

//设置子菜单中字体颜色

//                ll_search.setBackgroundColor(getResources().getColor(R.color.white_gray));
                ll_search.setVisibility(View.VISIBLE);
                tv_1.setTextColor(getResources().getColor(R.color.red));
                tv_2.setTextColor(getResources().getColor(R.color.black));
                tv_3.setTextColor(getResources().getColor(R.color.black));
                tv_4.setTextColor(getResources().getColor(R.color.black));
                tab1.setBackgroundColor(getResources().getColor(R.color.light_gray));
                tab2.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab3.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab4.setBackgroundColor(getResources().getColor(R.color.white_gray));
                mTabHost.setCurrentTab(0);
            }
        });
        tab2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                ll_search.setBackgroundColor(getResources().getColor(R.color.white_gray));
                ll_search.setVisibility(View.VISIBLE);
                tv_1.setTextColor(getResources().getColor(R.color.black));
                tv_2.setTextColor(getResources().getColor(R.color.red));
                tv_3.setTextColor(getResources().getColor(R.color.black));
                tv_4.setTextColor(getResources().getColor(R.color.black));
                tab1.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab2.setBackgroundColor(getResources().getColor(R.color.light_gray));
                tab3.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab4.setBackgroundColor(getResources().getColor(R.color.white_gray));
                mTabHost.setCurrentTab(1);
            }
        });
        tab3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                ll_search.setBackgroundColor(getResources().getColor(R.color.white_gray));
                ll_search.setVisibility(View.VISIBLE);
                tv_1.setTextColor(getResources().getColor(R.color.black));
                tv_2.setTextColor(getResources().getColor(R.color.black));
                tv_3.setTextColor(getResources().getColor(R.color.red));
                tv_4.setTextColor(getResources().getColor(R.color.black));
                tab1.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab2.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab3.setBackgroundColor(getResources().getColor(R.color.light_gray));
                tab4.setBackgroundColor(getResources().getColor(R.color.white_gray));
                mTabHost.setCurrentTab(2);
            }
        });
        tab4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                ll_search.setBackgroundColor(getResources().getColor(R.color.red));
                ll_search.setVisibility(View.GONE);
                tv_1.setTextColor(getResources().getColor(R.color.black));
                tv_2.setTextColor(getResources().getColor(R.color.black));
                tv_3.setTextColor(getResources().getColor(R.color.black));
                tv_4.setTextColor(getResources().getColor(R.color.red));
                tab1.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab2.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab3.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab4.setBackgroundColor(getResources().getColor(R.color.light_gray));
                mTabHost.setCurrentTab(3);
            }

        });

//设置页面初始化时,默认选中的菜单

        tv_1.setTextColor(getResources().getColor(R.color.red));
        tv_2.setTextColor(getResources().getColor(R.color.black));
        tv_3.setTextColor(getResources().getColor(R.color.black));
        tv_4.setTextColor(getResources().getColor(R.color.black));
        tab1.setBackgroundColor(getResources().getColor(R.color.light_gray));
        tab2.setBackgroundColor(getResources().getColor(R.color.white_gray));
        tab3.setBackgroundColor(getResources().getColor(R.color.white_gray));
        tab4.setBackgroundColor(getResources().getColor(R.color.white_gray));

//iv_shopCar ,iv_main ,ll_search ,这三项是顶端标题栏中的控件,可以不用理会,跟实现底部菜单栏没关系
        iv_shopCar = findViewById(R.id.iv_shopCar);
        iv_main = findViewById(R.id.iv_main);
        ll_search = findViewById(R.id.ll_search);


        iv_shopCar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                ll_search.setBackgroundColor(getResources().getColor(R.color.white_gray));
                ll_search.setVisibility(View.VISIBLE);
                tv_1.setTextColor(getResources().getColor(R.color.black));
                tv_2.setTextColor(getResources().getColor(R.color.black));
                tv_3.setTextColor(getResources().getColor(R.color.red));
                tv_4.setTextColor(getResources().getColor(R.color.black));
                tab1.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab2.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab3.setBackgroundColor(getResources().getColor(R.color.light_gray));
                tab4.setBackgroundColor(getResources().getColor(R.color.white_gray));
                mTabHost.setCurrentTab(2);
            }
        });
        iv_main.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                ll_search.setBackgroundColor(getResources().getColor(R.color.red));
                ll_search.setVisibility(View.GONE);
                tv_1.setTextColor(getResources().getColor(R.color.black));
                tv_2.setTextColor(getResources().getColor(R.color.black));
                tv_3.setTextColor(getResources().getColor(R.color.black));
                tv_4.setTextColor(getResources().getColor(R.color.red));
                tab1.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab2.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab3.setBackgroundColor(getResources().getColor(R.color.white_gray));
                tab4.setBackgroundColor(getResources().getColor(R.color.light_gray));
                mTabHost.setCurrentTab(3);
            }
        });
    }

    /**
     * 给每个Tab按钮设置图标和文字
     */
    private View getTabItemView(int index) {
        View view = mLayoutInflater.inflate(R.layout.tab_item_view, null);
        ImageView imageView = (ImageView) view.findViewById(R.id.imageview);
        imageView.setImageResource(mImageArray[index]);
        TextView textView = (TextView) view.findViewById(R.id.textview);
        textView.setText(mTextArray[index]);
        return view;
    }

    /**
     * 启动SecondActivity
     *
     * @param context 上下文
     */
    public static void startActivity(Context context) {
        Intent intent = new Intent();
        intent.setClass(context, SecondActivity.class);
        context.startActivity(intent);
    }

}

2、布局文件 activity_second_main

<?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">
    <include layout="@layout/activity_title" />
    <FrameLayout
        android:id="@+id/realtabcontent"
        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"
        android:background="@color/white_gray">
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />
    </android.support.v4.app.FragmentTabHost>

</LinearLayout>

 

3、自定义顶端标题栏  布局文件 activity_title

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_search"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@color/white_gray"
    android:orientation="horizontal">
    <ImageView
        android:id="@+id/iv_main"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_gravity="center_vertical"
        android:layout_margin="@dimen/margin_5"
        android:src="@drawable/icon_user_48" />
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="35dp"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="@dimen/margin_10"
        android:layout_marginRight="@dimen/margin_10"
        android:layout_weight="1"
        android:background="@color/white"
        android:orientation="horizontal">
        <ImageView
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_gravity="center_vertical"
            android:src="@drawable/search" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="搜索你想要的" />
    </LinearLayout>
    <ImageView
        android:id="@+id/iv_shopCar"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_gravity="center_vertical"
        android:layout_margin="@dimen/margin_5"
        android:src="@drawable/icon_shop_car_48" />

</LinearLayout>

 

4、用于显示菜单的布局文件 tab_item_view

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:focusable="false"
        android:padding="3dp" />

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="10sp" />
 

</LinearLayout>

 

5、Fragment根据自己项目的需求,自己定义即可。

到这里FragmentTabHost实现底部菜单栏就实现了,是不是很简单呢?

 

 

Android FragmentTabHost应用详解 本文还有配套的精品资源,点击获取 简介:FragmentTabHost是Android开发中用于创建多Fragment标签页的组件,适用于API级别低于11的设备。它将每个标签与一个Fragment关联,提供方便的管理与切换,增强用户界面导航体验。文章介绍了FragmentTabHost的基本概念、使用步骤、注意事项,并通过示例代码展示其实现方式。 1. Frag... 阅读详情

相关推荐

Android中FragmentTabHost结合fragment实现选项卡功能

android中FragmnetTabHoat,实现选项卡功能,是非常常用的,我写了一个例子,希望大家下载,交流

android tabhost底部导航栏,FragmentTabHost FrameLayout实现底部导航栏

app经常用到底部导航栏,早前使用过RadioGroup+FrameLayout实现或者RadioGroup+ViewPager实现,现在基本使用FragmentTabHost+FrameLayout来实现,因为使用起来简单易用。下面写一个小例子简要地总结一下这个组合。首先,看一下例子的最终运行效果图这5个图标的效果其实都是一样的,只要做出来一个,以此类推就可以写出其他几个第一步,Fragment...

weixin_30975237的博客 302

android常见Activity+Fragment标签页布局demo

android常见Activity+Fragment标签页布局源码,应用主页常见布局

Android FragmentTabHost实现底部tab切换

一、概述:1、实现如下图的底部Tab效果,点击tab颜色变化 2、示例图: 二、实现:1、创建布局<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="

lovoo的博客 995

Activity嵌套fragment大全,activity加载单个fragment,TabLayout+ViewPager实现多个fragment滑动效果

Activity嵌套fragment大全,activity加载单个fragment,TabLayout+ViewPager实现多个fragment滑动效果

FragmentTabHos+Fragment+viewPager底部导航栏实现

FragmentTabHos+Fragment+viewPager底部导航栏实现,代码易改,一次下载终身可用。

【Android开发--新手必看篇】选项卡与滑动界面 FragmentTabHost && ViewPager

Android笔记 ​ ——选项卡与滑动界面 【若对该知识点有更多想了解的,欢迎私信博主~~】 选项卡与滑动界面:FragmentTabHost and ViewPager FragmentTabHost : 第一步:在Activity布局文件中添加FragmentTabHost控件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re

江川一梦的博客 392

使用Fragment实现底部菜单的切换

在做android项目的时候,经常会遇到底部有几个菜单,点击之后,页面上面部分需要展示不同的内容,这个源代码做了个简单的示例,大家可以看下

android的fragment作用,android使用FragmentActivity、Fragment实现tab切换的功能

目前主流的app都在下面有一排按钮来选择切换页面,可以使用Fragment来实现Tab效果来达到目的,要想用Fragment 功能必须先让activity继承FragmentActivity,其原因是里面包含了Fragment运作的FragmentManager接口的实现类 FragmentManagerImpl ,由这个类管理所有Fragment的显示、隐藏,下面我们实现一个有首页和设置两个界面...

weixin_39915815的博客 880

为什么类型论是函数式编程的理想基础?

函数式编程(如Haskell、Scala、OCaml)以“函数为核心”“无副作用”“不可变数据”等特性著称,但它的“安全高效”并非凭空而来——背后的关键支撑是类型论。本文将聚焦“类型论如何支撑函数式编程”,从基础概念到具体案例,解释两者的本质联系。本文将按“故事引入→核心概念解释→关系拆解→原理+代码案例→实际应用→总结”的逻辑展开,用“乐高积木”“菜谱”等比喻贯穿全文,确保抽象理论可视化。类型论:程序的“接口规则手册”,定义类型和函数的约束;函数式编程。

AI天才研究院 694

【Labview与SQL Server互联(labview可以引用数据库)】

Labview与SQL Server互联

Magize的博客 3585

【Android UI设计与开发】第08期:底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏

【Android UI设计与开发】第08期:底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏 标签: FragmentFragmentTabHostAndroid底部菜单栏仿新浪微博Android选项卡 2013-06-03 21:38 50975人阅读 评论(71) 收藏 举报  分类:   Android UI设计与开发

qq_17169057的专栏 663

如何实现电路级别的CDM ESD防护

采用先进制程的CMOS工艺,可能具有比以前更薄的栅极氧化物和更大的芯片尺寸,大的衬底可能积累大量的电荷,导致CDM事件期间的高ESD放电峰值电流。传统CDM保护器件使用栅极接地NMOS被添加到输入级的栅极。然而,这种方法通常会在信号路径上引入显著的寄生电容,这不适合RF应用。

weixin_42693135的博客 2501
上一篇: Android开发:给图片添加水印
下一篇: Android开发:PopupWindow实现底部弹出框
android157
博客等级 码龄9年 193粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值