【Android开发笔记】底部菜单栏 FragmentTabHost

公司项目,需求本来是按照谷歌官方指南写的,菜单栏设计成在导航栏下方

结果呢,审评时,BOSS为了和iOS统一,改成了底部菜单栏(标准结局),我只能呵呵呵呵呵呵呵

查了查资料发现实现底部菜单栏用的是FragmentTabHost,下面记录下具体如何实现的

首先,假设我有3个菜单栏,对应3个Fragment:FragmentA、FragmentB、FragmentC

这3个Fragment将由3个一个Activity控制:TabHostActivity

TabHostActivity对应的xml文件:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2               android:orientation="vertical"
 3               android:layout_width="match_parent"
 4               android:layout_height="match_parent">
 5
 6     <FrameLayout
 7         android:id="@+id/real_tab_content"
 8         android:layout_width="match_parent"
 9         android:layout_height="0dp"
10         android:layout_weight="1"/>
11
12     <RadioGroup
13         android:id="@+id/radio_tab_bottom_menu"
14         android:layout_width="match_parent"
15         android:layout_height="wrap_content"
16         android:background="#111111"
17         android:orientation="horizontal">
18
19         <RadioButton
20             android:id="@+id/tab_patient_list"
21             style="@style/tab_rb_style"
22             android:checked="true"
23             android:text="@string/tab_patient_list"/>
24
25         <RadioButton
26             android:id="@+id/tab_message"
27             style="@style/tab_rb_style"
28             android:text="@string/tab_message"/>
29
30         <RadioButton
31             android:id="@+id/tab_settings"
32             style="@style/tab_rb_style"
33             android:text="@string/tab_settings"/>
34
35     </RadioGroup>
36
37     <android.support.v4.app.FragmentTabHost
38         android:id="@android:id/tabhost"
39         android:layout_width="match_parent"
40         android:layout_height="wrap_content"
41         android:visibility="gone" >
42
43         <FrameLayout
44             android:id="@android:id/tabcontent"
45             android:layout_width="0dp"
46             android:layout_height="0dp"
47             android:layout_weight="0"/>
48     </android.support.v4.app.FragmentTabHost>
49
50 </LinearLayout>

其中,id为real_tab_content的fragment存放用于显示的Fragment。

TabHostActivity:

 1 public class TabHostActivity extends FragmentActivity{
 2     private FragmentTabHost mFragmentTabHost;
 3     private RadioGroup mTabRg;
 4
 5     private final Class[] fragments = {
 6             FragmentA.class,
 7             FragmentB.class,
 8             FragmentC.class
 9     };
10
11     @Override
12     protected void onCreate(Bundle savedInstanceState) {
13         super.onCreate(savedInstanceState);
14         setContentView(R.layout.activity_bottom_menu);
15
16         initView();
17     }
18
19     private void initView() {
20         // 构建TabHost
21         mFragmentTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
22         // getSupportFragmentManager():
23         // return the fragmentManager for interacting with fragments associated with this activity.
24         // setup(Context context, FragmentManager manager, int containerId)
25         mFragmentTabHost.setup(this, getSupportFragmentManager(), R.id.real_tab_content);
26
27         int count = fragments.length;
28         for (int i = 0; i < count; i++) {
29             // A tab has a tab indicator, content, and a tag that is used to keep track of it.
30             // newTabSpec(String tag):
31             // Get a new TabHost.TabSpec associated with this tab host.
32             TabHost.TabSpec tabSpec = mFragmentTabHost.newTabSpec(i + "").setIndicator(i + "");
33             mFragmentTabHost.addTab(tabSpec, fragments[i], null);
34         }
35
36         mTabRg = (RadioGroup) findViewById(R.id.radio_tab_bottom_menu);
37
38         mTabRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
39             @Override
40             public void onCheckedChanged(RadioGroup radioGroup, int i) {
41                 switch (i) {
42                     case R.id.tab_patient_list:
43                         mFragmentTabHost.setCurrentTab(0);
44                         break;
45
46                     case R.id.tab_message:
47                         mFragmentTabHost.setCurrentTab(1);
48                         break;
49
50                     case R.id.tab_settings:
51                         mFragmentTabHost.setCurrentTab(2);
52                         break;
53
54                     default:
55                         break;
56                 }
57             }
58         });
59     }
60
61 }

FragmentA:

 1 public class FragmentA extends Fragment {
 2     private View rootView;
 3
 4     @Override
 5     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 6         if (rootView == null) {
 7             rootView = inflater.inflate(R.layout.fragment_settings, container, false);
 8         }
 9      
10         ViewGroup parent = (ViewGroup) rootView.getParent();
11         if (parent != null) {
12             parent.removeView(rootView);
13         }
14
15         return rootView;
16     }
17 }

FragmentB、C同理。

时间: 2024-10-10 16:58:40

【Android开发笔记】底部菜单栏 FragmentTabHost的相关文章

【转】Android开发笔记(序)写在前面的目录

原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入门上:其次是想拾缺补漏,写写虽然小众却又用得着的东西:另外就是想以实用为主,不求大而全,但求小而精:还有就是有的知识点是java的,只是Android开发也会经常遇上,所以蛮记下来.个人的经

Android开发笔记(一百三十四)协调布局CoordinatorLayout

协调布局CoordinatorLayout Android自5.0之后对UI做了较大的提升,一个重大的改进是推出了MaterialDesign库,而该库的基础即为协调布局CoordinatorLayout,几乎所有的design控件都依赖于该布局.协调布局的含义,指的是内部控件互相之前的动作关联,比如在A视图的位置发生变化之时,B视图的位置也按照某种规则来变化,仿佛弹钢琴有了协奏曲一般. 使用CoordinatorLayout时,要注意以下几点:1.导入design库:2.根布局采用androi

[置顶] Android开发笔记(成长轨迹)

分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API 调用了未实现的OpenGL ES API函数,一般由于导入的第三方库如地图库,里面有用到OpenGL,但是模拟器的硬件默认是没有这个的,所以需要我们编辑模拟器Emulation Options选项勾选 Use Host GPU 然后重启模拟器再尝试,如果还是这个错误,那么我们只好用真机测试了. 2.

Android开发笔记(一百零三)地图与定位SDK

集成地图SDK 国内常用的地图SDK就是百度和高德了,二者的用法大同小异,可按照官网上的开发指南一步步来.下面是我在集成地图SDK时遇到的问题说明: 1.点击基本地图功能选项,不能打开地图,弹出"key验证出错!请在AndroidManifest.xml文件中检查key设置的"的红色字提示.查看日志提示"galaxy lib host missing meta-data,make sure you know the right way to integrate galaxy&

[APP] Android 开发笔记 003

接上节 [APP] Android 开发笔记 002 5. 使用ant release 打包 1)制作 密钥文件 release.keystore (*.keystore) keytool -genkey -v -keystore "release.keystore" -alias "release" -keyalg "RSA" -validity "10000" 这里需要注意的是: -keystore "relea

《ArcGIS Runtime SDK for Android开发笔记》——(10)、ArcGIS Runtime SDK支持的空间数据类型

1.前言 移动端的数据来源非常重要,它决定了移动端功能的实现.早期的ArcGIS Android API中,主要以接入在线的数据源为主,因此主要实现在线的地图浏览.查询和路径分析.地理处理等从操作:在v1.0.1版本中,ArcGIS移动产品第一次可以加载松散型切片,自此逐渐掀开了对本地离线数据源的支持,也因此可以在移动端实现越来越受欢迎的离线功能.现在最新的10.2.7 API离线支持数据主要包括紧凑型切片.tpk切片包..geodatabase..shp文件.地名地址库.网络数据集. 转载请注

Android开发笔记--hello world 和目录结构

原文:Android开发笔记--hello world 和目录结构 每接触一个新东西 都有一个hello world的例子. 1.新建项目 2.配置AVD AVD 没有要新建个,如果不能创建 运行SDK Manager更新 3.接着运行就可以了 第一次启动要1分多钟 不要关 4.添加代码 5.接着在运行就OK了 目录结构 1.src - 用于放置源程序 2.gen - 自动生成 R.java 文件,用于引用资源文件(即 res 目录下的数据) 3.assets - 用于放置原始文件,Androi

Android开发笔记(一百一十六)网络学习资源

知名网站 本系列的开发笔记,对Android开发来说只是沧海一瓢,还有更多的技术等待我们去汲取.下面列出几个常用的开发网站,供初学者上路: 首先当然是国内首屈一指的技术网站csdn啦,csdn提供了众多频道,包括博客.论坛.下载.问答等等,其中博客专栏提供了最新的技术文章,值得推荐.csdn博客专栏的地址是 http://blog.csdn.net/column.html 下面是csdn博客专栏的网页截图: 其次是国外有名的开源网站GitHub,这里有众多的开源项目源码,是开发者分享代码的乐园.

Android开发笔记(八十八)同步与加锁

同步synchronized 同步方法 synchronized可用来给方法或者代码块加锁,当它修饰一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.这就意味着,当两个并发线程同时访问synchronized代码块时,两个线程只能是排队做串行处理,另一个线程要等待前一个线程执行完该代码块后,才能再次执行synchronized代码块. 使用synchronized修饰某个方法,该方法便成为一个同步方法,在同一时刻只能有一个线程执行该方法.可是,synchronized的锁机制太

android开发笔记1

1.强制横屏,不能转屏 在AndroidManifest中需要的activity里: <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">   <activity android:name=".GestureFlip"     android:label="@string/app_name"