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

短命女 2022-08-20 14:17 293阅读 0赞

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

RadioGroup+RadioButton

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent" android:layout_height="match_parent"
  4. android:orientation="vertical"
  5. >
  6. <android.support.v4.view.ViewPager
  7. android:id="@+id/myViewPager"
  8. android:layout_width="match_parent"
  9. android:layout_height="0dp"
  10. android:layout_weight="1"
  11. />
  12. <RadioGroup
  13. android:id="@+id/rg_group"
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:background="@mipmap/bottom_tab_bg"
  17. android:orientation="horizontal"
  18. >
  19. <RadioButton
  20. android:id="@+id/rb_home"
  21. style="@style/BottomTabStyle"
  22. android:drawableTop="@drawable/btn_tab_home_selector"
  23. android:text="首页" />
  24. <RadioButton
  25. android:id="@+id/rb_news"
  26. style="@style/BottomTabStyle"
  27. android:drawableTop="@drawable/btn_tab_news_selector"
  28. android:text="新闻中心" />
  29. <RadioButton
  30. android:id="@+id/rb_smart"
  31. style="@style/BottomTabStyle"
  32. android:drawableTop="@drawable/btn_tab_smart_selector"
  33. android:text="智慧服务" />
  34. <RadioButton
  35. android:id="@+id/rb_gov"
  36. style="@style/BottomTabStyle"
  37. android:drawableTop="@drawable/btn_tab_gov_selector"
  38. android:text="政务" />
  39. <RadioButton
  40. android:id="@+id/rb_setting"
  41. style="@style/BottomTabStyle"
  42. android:drawableTop="@drawable/btn_tab_setting_selector"
  43. android:text="设置" />
  44. </RadioGroup>
  45. </LinearLayout>

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

  1. //获取资源
  2. RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.rg_group);
  3. ViewPager noScrollViewPager = = (NoScrollViewPager) view.findViewById(R.id.noScrollViewPager);
  4. //给ViwPage设置Adapter
  5. noScrollViewPager.setAdapter(XXXX);
  6. radioGroup = (RadioGroup) view.findViewById(R.id.rg_group);
  7. //默认radioGroup的那个是被选中的
  8. radioGroup.check(R.id.rb_home);
  9. //还需在viewpager中显示该radioGroup对应的viewpager
  10. xxxxx
  11. //设置RadioGroup的点击监听,用来设置点击切换界面
  12. radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  13. @Override
  14. public void onCheckedChanged(RadioGroup radioGroup, int i) {
  15. switch (i){
  16. case R.id.rb_home:
  17. //点击不同的radioGroup刷新到不同的viewpager
  18. noScrollViewPager.setCurrentItem(0, false);
  19. break;
  20. case R.id.rb_news:
  21. noScrollViewPager.setCurrentItem(1,false);
  22. break;
  23. case R.id.rb_smart:
  24. noScrollViewPager.setCurrentItem(2,false);
  25. break;
  26. case R.id.rb_gov:
  27. noScrollViewPager.setCurrentItem(3,false);
  28. break;
  29. case R.id.rb_setting:
  30. noScrollViewPager.setCurrentItem(4,false);
  31. break;
  32. }
  33. }
  34. });

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

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

FragmentTabHost

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context=".HomeActivity">
  8. <FrameLayout
  9. android:id="@+id/main_frameLayout"
  10. android:layout_width="match_parent"
  11. android:layout_height="0dp"
  12. android:layout_weight="1"
  13. />
  14. <!--如下的写法不能变,id值都是固定的-->
  15. <android.support.v13.app.FragmentTabHost
  16. android:id="@android:id/tabhost"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. >
  20. <FrameLayout
  21. android:id="@android:id/tabcontent"
  22. android:layout_width="0dp"
  23. android:layout_height="0dp"
  24. android:layout_weight="0">
  25. </FrameLayout>
  26. </android.support.v13.app.FragmentTabHost>
  27. </LinearLayout>

Activity

  1. //生成底部菜单共三步.
  2. /*
  3. *1.初始化Tabhost
  4. *2.新建TabSpec
  5. *3.添加TabSpec到TabHost
  6. */
  7. FragmentTabHost fragmentTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
  8. fragmentTabHost.setup(this,getFragmentManager(),R.id.main_frameLayout);
  9. //通过循环添加
  10. for(int i=0;i<4;i++){
  11. //newTabSpec的参数表示唯一表示符。用来确定那个被点击
  12. TabHost.TabSpec tabSpec = fragmentTabHost.newTabSpec(tabSpecs[i]).setIndicator(View view);
  13. //方法setIndicator()的参数即为显示的view
  14. fragmentTabHost.addTab(tabSpec,fragmentArray[i],null);
  15. //addTab的第二个参数即为该TabSpec对应的fragment
  16. }
  17. //取消每个条目之间的分割线
  18. fragmentTabHost.getTabWidget().setDividerDrawable(android.R.color.white);
  19. // 初始化 第一个条目被选中 通过唯一标识符确定
  20. fragmentTabHost.setCurrentTabByTag(tabSpecs[0]);

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

发表评论

表情:
评论列表 (有 0 条评论,293人围观)

还没有评论,来说两句吧...

相关阅读