Android底部菜单的两种实现方式

本文介绍了在Android应用中创建底部菜单的两种常见方法:使用RadioGroup+RadioButton和FragmentTabHost。RadioGroup实现简单,但存在图片大小限制等问题。而FragmentTabHost提供更灵活的选项,能更好地适配复杂需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

市面上的APP常见的一个UI界面就是底部有多个菜单按钮,通过点击不同的按钮切换不同的页面。如微信,QQ等..
之前在开发一个新闻客户端的时候也使用了这种布局,当时使用的是 RadioGroup +RadioButton 来完成的。
后面在开发一个即时通讯APP的时候发现使用RadioGroup +RadioButton有一些局限行,于是改成用 FragmentTabHost 来完成。
这里简单记录一下如何用这两种技术来实现底部菜单的效果:

RadioGroup+RadioButton


<?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"
    >
    <android.support.v4.view.ViewPager
    android:id="@+id/myViewPager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    />
<RadioGroup
    android:id="@+id/rg_group"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@mipmap/bottom_tab_bg"
    android:orientation="horizontal"
    >
    <RadioButton
        android:id="@+id/rb_home"
        style="@style/BottomTabStyle"
        android:drawableTop="@drawable/btn_tab_home_selector"
        android:text="首页" />

    <RadioButton
        android:id="@+id/rb_news"
        style="@style/BottomTabStyle"
        android:drawableTop="@drawable/btn_tab_news_selector"
        android:text="新闻中心" />

    <RadioButton
        android:id="@+id/rb_smart"
        style="@style/BottomTabStyle"
        android:drawableTop="@drawable/btn_tab_smart_selector"
        android:text="智慧服务" />

    <RadioButton
        android:id="@+id/rb_gov"
        style="@style/BottomTabStyle"
        android:drawableTop="@drawable/btn_tab_gov_selector"
        android:text="政务" />

    <RadioButton
        android:id="@+id/rb_setting"
        style="@style/BottomTabStyle"
        android:drawableTop="@drawable/btn_tab_setting_selector"
        android:text="设置" />
    </RadioGroup>
</LinearLayout>

style与selector的内容此处不给出。

//获取资源
RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.rg_group);

ViewPager noScrollViewPager = = (NoScrollViewPager) view.findViewById(R.id.noScrollViewPager);
//给ViwPage设置Adapter
        noScrollViewPager.setAdapter(XXXX);
        radioGroup = (RadioGroup) view.findViewById(R.id.rg_group);
        //默认radioGroup的那个是被选中的
        radioGroup.check(R.id.rb_home);
        //还需在viewpager中显示该radioGroup对应的viewpager
        xxxxx
        //设置RadioGroup的点击监听,用来设置点击切换界面
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                 switch (i){
                     case R.id.rb_home:
                     //点击不同的radioGroup刷新到不同的viewpager
                         noScrollViewPager.setCurrentItem(0, false);
                         break;
                     case R.id.rb_news:
                         noScrollViewPager.setCurrentItem(1,false);
                         break;
                     case R.id.rb_smart:
                         noScrollViewPager.setCurrentItem(2,false);
                         break;
                     case R.id.rb_gov:
                         noScrollViewPager.setCurrentItem(3,false);
                         break;
                     case R.id.rb_setting:
                         noScrollViewPager.setCurrentItem(4,false);
                         break;

                 }
            }
        });

如上所示的代码即可完成。效果图:

这里写图片描述
这样虽然可以完成底部菜单的显示,但这种方法有这强的局限性。比如在设置RadioButton的时候是使用drawableTop来加入图片的。这种做法不能设置图片的宽高等属性,在某些时候则这种方法不可用。

FragmentTabHost

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".HomeActivity">

    <FrameLayout
        android:id="@+id/main_frameLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        />
      <!--如下的写法不能变,id值都是固定的-->
    <android.support.v13.app.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0">
            </FrameLayout>
        </android.support.v13.app.FragmentTabHost>
</LinearLayout>

Activity

//生成底部菜单共三步.
        /*
         *1.初始化Tabhost
         *2.新建TabSpec
         *3.添加TabSpec到TabHost
         */
   FragmentTabHost  fragmentTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
        fragmentTabHost.setup(this,getFragmentManager(),R.id.main_frameLayout);

 //通过循环添加
        for(int i=0;i<4;i++){
            //newTabSpec的参数表示唯一表示符。用来确定那个被点击
         TabHost.TabSpec tabSpec =  fragmentTabHost.newTabSpec(tabSpecs[i]).setIndicator(View view);
         //方法setIndicator()的参数即为显示的view
         fragmentTabHost.addTab(tabSpec,fragmentArray[i],null);
         //addTab的第二个参数即为该TabSpec对应的fragment
        }
        //取消每个条目之间的分割线
        fragmentTabHost.getTabWidget().setDividerDrawable(android.R.color.white);
        // 初始化 第一个条目被选中 通过唯一标识符确定
        fragmentTabHost.setCurrentTabByTag(tabSpecs[0]);

具体给TabSpec设置的View是我自定义的view。此处不给出代码.
效果图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值