用Fragment实现如新浪微博一样的底部菜单的切换

像我这个有强迫症的人来说,自从TabActivity抛弃之后,再使用看到一个个警告和一条条划着的横线,心里很不舒服,现在终于下定决心用Fragment来替换掉TabActivity了!我的研究成果如下:

首先是MainActivity,它需要继承FragmentActivity(这里是指:版本是3.0之前的继承FragmentActivity,3.0版本之后的继承Activity就可以),对于FragmentActivity的声明周期我就不过多介绍了,和Activity差不了多少,自己也能弄明白!下边是MainActivity的代码:

[java] view plaincopy

  1. package net.loonggg.fragment;
  2. import android.os.Bundle;
  3. import android.support.v4.app.Fragment;
  4. import android.support.v4.app.FragmentActivity;
  5. import android.support.v4.app.FragmentManager;
  6. import android.support.v4.app.FragmentTransaction;
  7. import android.view.Window;
  8. import android.widget.RadioButton;
  9. import android.widget.RadioGroup;
  10. import android.widget.RadioGroup.OnCheckedChangeListener;
  11. public class MainActivity extends FragmentActivity {
  12. private Fragment[] mFragments;
  13. private RadioGroup bottomRg;
  14. private FragmentManager fragmentManager;
  15. private FragmentTransaction fragmentTransaction;
  16. private RadioButton rbOne, rbTwo, rbThree, rbFour;
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. requestWindowFeature(Window.FEATURE_NO_TITLE);
  21. setContentView(R.layout.activity_main);
  22. mFragments = new Fragment[3];
  23. fragmentManager = getSupportFragmentManager();
  24. mFragments[0] = fragmentManager.findFragmentById(R.id.fragement_main);
  25. mFragments[1] = fragmentManager.findFragmentById(R.id.fragement_search);
  26. mFragments[2] = fragmentManager
  27. .findFragmentById(R.id.fragement_setting);
  28. fragmentTransaction = fragmentManager.beginTransaction()
  29. .hide(mFragments[0]).hide(mFragments[1]).hide(mFragments[2]);
  30. fragmentTransaction.show(mFragments[0]).commit();
  31. setFragmentIndicator();
  32. }
  33. private void setFragmentIndicator() {
  34. bottomRg = (RadioGroup) findViewById(R.id.bottomRg);
  35. rbOne = (RadioButton) findViewById(R.id.rbOne);
  36. rbTwo = (RadioButton) findViewById(R.id.rbTwo);
  37. rbThree = (RadioButton) findViewById(R.id.rbThree);
  38. bottomRg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
  39. @Override
  40. public void onCheckedChanged(RadioGroup group, int checkedId) {
  41. fragmentTransaction = fragmentManager.beginTransaction()
  42. .hide(mFragments[0]).hide(mFragments[1])
  43. .hide(mFragments[2]);
  44. switch (checkedId) {
  45. case R.id.rbOne:
  46. fragmentTransaction.show(mFragments[0]).commit();
  47. break;
  48. case R.id.rbTwo:
  49. fragmentTransaction.show(mFragments[1]).commit();
  50. break;
  51. case R.id.rbThree:
  52. fragmentTransaction.show(mFragments[2]).commit();
  53. break;
  54. default:
  55. break;
  56. }
  57. }
  58. });
  59. }
  60. }

下边对应的是MainActivity的布局文件activity_main.xml:

[html] view plaincopy

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="@drawable/activity_bg"
  6. android:orientation="vertical" >
  7. <!-- 上边主页面 -->
  8. <fragment
  9. android:id="@+id/fragement_main"
  10. android:name="net.loonggg.fragment.FragmentMain"
  11. android:layout_width="fill_parent"
  12. android:layout_height="fill_parent"
  13. android:layout_weight="10" />
  14. <fragment
  15. android:id="@+id/fragement_search"
  16. android:name="net.loonggg.fragment.FragmentSearch"
  17. android:layout_width="fill_parent"
  18. android:layout_height="fill_parent"
  19. android:layout_weight="10" />
  20. <fragment
  21. android:id="@+id/fragement_setting"
  22. android:name="net.loonggg.fragment.FragmentSetting"
  23. android:layout_width="fill_parent"
  24. android:layout_height="fill_parent"
  25. android:layout_weight="10" />
  26. <!-- 底部菜单页面 -->
  27. <RadioGroup
  28. android:id="@+id/bottomRg"
  29. android:layout_width="fill_parent"
  30. android:layout_height="wrap_content"
  31. android:layout_weight="0.5"
  32. android:background="@drawable/tab_footer_bg"
  33. android:orientation="horizontal" >
  34. <RadioButton
  35. android:id="@+id/rbOne"
  36. style="@style/rg_btn_style"
  37. android:checked="true"
  38. android:drawableTop="@drawable/rb_one_btn_selector"
  39. android:text="首页" />
  40. <RadioButton
  41. android:id="@+id/rbTwo"
  42. style="@style/rg_btn_style"
  43. android:drawableTop="@drawable/rb_two_btn_selector"
  44. android:text="搜索" />
  45. <RadioButton
  46. android:id="@+id/rbThree"
  47. style="@style/rg_btn_style"
  48. android:drawableTop="@drawable/rb_three_btn_selector"
  49. android:text="设置" />
  50. </RadioGroup>
  51. </LinearLayout>

这里为了大家方便,展示一下项目的布局图:

再下边是要设计的首页界面,它是继承的Fragment,具体看代码:

[java] view plaincopy

  1. package net.loonggg.fragment;
  2. import android.os.Bundle;
  3. import android.support.v4.app.Fragment;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.TextView;
  8. public class FragmentMain extends Fragment {
  9. private TextView tv;
  10. @Override
  11. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  12. Bundle savedInstanceState) {
  13. return inflater.inflate(R.layout.fragment_main, container, false);
  14. }
  15. @Override
  16. public void onActivityCreated(Bundle savedInstanceState) {
  17. super.onActivityCreated(savedInstanceState);
  18. tv = (TextView) getView().findViewById(R.id.titleTv);
  19. tv.setText("首页");
  20. }
  21. }

接着是对应的布局文件代码fragment_main.xml:

[html] view plaincopy

  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"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <include
  7. android:id="@+id/one_title"
  8. layout="@layout/title_bar" />
  9. <TextView
  10. android:layout_width="fill_parent"
  11. android:layout_height="fill_parent"
  12. android:gravity="center"
  13. android:text="这是首页"
  14. android:textColor="#000000" />
  15. </LinearLayout>

再接着是:搜索界面的代码:

[java] view plaincopy

  1. package net.loonggg.fragment;
  2. import android.os.Bundle;
  3. import android.support.v4.app.Fragment;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.TextView;
  8. public class FragmentSearch extends Fragment {
  9. private TextView tv;
  10. @Override
  11. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  12. Bundle savedInstanceState) {
  13. return inflater.inflate(R.layout.fragment_search, container, false);
  14. }
  15. @Override
  16. public void onActivityCreated(Bundle savedInstanceState) {
  17. super.onActivityCreated(savedInstanceState);
  18. tv = (TextView) getView().findViewById(R.id.titleTv);
  19. tv.setText("搜索");
  20. }
  21. @Override
  22. public void onPause() {
  23. super.onPause();
  24. }
  25. }

如上是对应的布局文件的代码fragment_search.xml:

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical" >
  6. <include layout="@layout/title_bar" />
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:gravity="center"
  11. android:text="这是搜索界面"
  12. android:textColor="#000000" />
  13. </LinearLayout>

紧跟着是:设置界面的代码:

[java] view plaincopy

  1. package net.loonggg.fragment;
  2. import android.os.Bundle;
  3. import android.support.v4.app.Fragment;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.TextView;
  8. public class FragmentSetting extends Fragment {
  9. private TextView tv;
  10. @Override
  11. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  12. Bundle savedInstanceState) {
  13. return inflater.inflate(R.layout.fragment_setting, container, false);
  14. }
  15. @Override
  16. public void onActivityCreated(Bundle savedInstanceState) {
  17. super.onActivityCreated(savedInstanceState);
  18. tv = (TextView) getView().findViewById(R.id.titleTv);
  19. tv.setText("设置");
  20. }
  21. }

当然一样,下边对应的是设置界面的布局文件代码fragment_setting.xml:

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical" >
  6. <include layout="@layout/title_bar" />
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:gravity="center"
  11. android:text="这是设置页面"
  12. android:textColor="#000000" />
  13. </LinearLayout>

最后是我用的title_bar.xml文件,这个文件是嵌入到各个界面中的那个顶部的标题的布局文件,代码如下:

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:background="@drawable/title_bg"
  6. android:gravity="center"
  7. android:orientation="vertical" >
  8. <TextView
  9. android:id="@+id/titleTv"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:layout_gravity="center"
  13. android:gravity="center"
  14. android:textColor="#ffffff"
  15. android:textSize="20sp" />
  16. </LinearLayout>

到这里就基本完成了!!!你会了吗?

时间: 2024-08-04 19:42:36

用Fragment实现如新浪微博一样的底部菜单的切换的相关文章

Android项目开发实战之使用Fragment和FragmentTabHost搭建底部菜单(一)

学习在于实用,只有把自己学到的东西真正的融入到我们的开发中,并且使用的得心应手,那才是真正的掌握.而想把技术使用的得心应手并不是一蹴而就的,需要不断的巩固自己的知识体系,需要大量的实战练习,当然还不能缺少你的专研和耐心. 但是很多小伙伴们并不一定学过的知识都掌握了,而且相信很多伙伴们即使学习一种技术也还是停留在读过,看过,学习过,并没有真正的实战过,所以当时学习的技术觉得自己真正的学会了,搞懂了,而且信心满满的觉得自己可以不必在练习了,这是不对的,因为一时的学习并没有立马转变成为你的技能,而是需

Android自定义TabActivity(实现仿新浪微博底部菜单更新UI)

如今Android上很多应用都采用底部菜单控制更新的UI这种框架,例如新浪微博 点击底部菜单的选项可以更新界面.底部菜单可以使用TabHost来实现,不过用过TabHost的人都知道自定义TabHost究竟是有多麻烦的,原生TabHost的风格是不依附屏幕的底部的,要依附底部就要重写布局. TabHost设置的Container可以管理UI的显示,UI可以用LayoutInflater动态生成,也可以是Activity,但不好管理Activity的生命周期.然后用TabHost控制显示UI的显示

安卓开发复习笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航) 安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航) 关于Fragment类在之前的安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)也介绍过,这里就不再重复阐述了. 国际惯例,先来张效果图: 下面

转-Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

http://www.cnblogs.com/lichenwei/p/3985121.html 记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航) 安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航) 关于Fragment类在之前的安卓开发复习笔记——Fragment+Vie

底部菜单中用fragment,fragment中套用PagerSlidingTabStrip,切换底部时viewpager消失

今天在开发时遇上一个问题,我用的框架是底部菜单四个按钮+fragment,然后主页中的fragment套用了PagerSlidingTabStrip,PagerSlidingTabStrip中是用Viewpager+Tab组合进行点击切换页面或者滑动切换菜单,就这样实现了我想要的功能,可是当我在底部菜单中相互切换时,PagerSlidingTabStrip中的Viewpeger消失了,这是怎么产生的呢?官方的Demo没有组合起来使用,所以没有问题,现在组合后问题就出来了,我换用了几个方法都没有解

仿饿了么等APP底部菜单(Fragment实现)

Fragment实现的底部菜单导航,是现在很多APP都有的功能,效果就是点击菜单之后,菜单实现图标和颜色的变换 实现起来主要有两种方法,一种是Tabhost,一种是Android3.0之后的Fragment Fragment,需要加入v4价包 然后icon图标的话,需求自己做,或者去http://www.iconfont.cn/,阿里的图库下载 底部菜单的图标有两种,一种是默认图标,一种是点击菜单之后的图标 UI: <LinearLayout xmlns:android="http://s

BottomBar之Android底部菜单

BottomBar之Android底部菜单 前言:开源项目BottomBar,实现Android底部菜单(常用菜单,BottomBar实现动画(上下式)+消息菜单,BottomBar+ViewPager+Fragment实现炫酷的底部导航效果) 效果: 开发环境:AndroidStudio2.2.1+gradle-2.14.1 引入依赖: compile 'com.android.support:appcompat-v7:23.0.0' compile 'com.android.support:

转-TabHost组件(一)(实现底部菜单导航)

http://www.cnblogs.com/lichenwei/p/3974009.html 什么是TabHost? TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用windows操作系统的时候,经常见到如图所示的图形界面. TabHost选项卡,说到这个组件,不得不先说一件事情,翻翻谷歌提供给我们的API,我们可以发现这样的一段话: 它告诉我们,这个组件在安卓4.0之后已经被废弃了,建议我们新的程序应该使用Fragment组件来代替它. 其实并不出乎意料,使用过Tab

Android自定义控件----RadioGroup实现APP首页底部Tab的切换

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4463931.html 联系方式:[email protected] [正文] 实现APP首页底部Tab的切换已经见过四五种方式了,先来看运行的效果图吧: 今天我们就用RadioGroup的方法来实现以下. [开发环境] 物理机版本:win 7旗舰版(64位) IDE版本:Android Stud