目录:

一、概述

最近在做一个新闻类结合社区的APP的时候,需要添加一个侧滑菜单的效果,考虑到可以使用DrawerLayout布局,但是问题是使用了 DrawerLayout布局后,主页内容应该是一个Fragment类,类似QQ主页的效果,那么问题来了,如何在主页的底部添加TabHost导航的 效果呢?之前使用过FragmentTabHost,在我的另一篇文章里,点击这里查看,在一个DrawerLayout里面再使用一个FragmentTabHost添加TabHost导航效果,经过测试,发觉不行,于是考虑使用RadioGroupRadioButton嵌套到Fragment里面,加载页面的时候,我们可以通过RadioButton选项,切换对应的Fragment,效果图:

二、认识RadioGroup和RadioButton

RadioButton在做表单的时候经常用到,在安卓开发中,RadioButton需要和RadioGroup一起使用,表示在一组可选项中,
只有一个可以被选中,RadioGroup状态改变的一个监视器OnCheckedChangeListener,RadioGroup使用的时候调用
setOnCheckedChangeListener(),然后重写OnCheckedChangeListener中的
onCheckedChanged()方法,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener(){
           @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        // 获取变更后的选项的ID
        int radioButtonId = group.getCheckedRadioButtonId();
        switch (radioButtonId) {
        case R.id.message_radiobtn:
            mFragment = new MessageFragment();
            break;
        case R.id.contact_radiobtn:
            mFragment = new ContactFragment();
            break;
        case R.id.dynamic_radiobtn:
            mFragment = new DynamicFragment();
            break;
        default:
            break;
        }
        getActivity().getSupportFragmentManager().beginTransaction()
                .replace(R.id.realtabcontent, mFragment).commit();
    }
});

OnCheckedChangeListener(RadioGroup,int)中有两个参数,RadioGroup表示当前哪个选项组,指定选项组下的选项,int表示是否选中状态。

三、自定义RadioButton

RadioButton默认状态下,前面带一个小圆点,文字在小圆点的右边,同时设置的图片也不是刚好在文字上面,而我们的TabHost导航中不
需要小圆点,如何去掉小圆点并让文字居中显示,我们可以自定义一个样式,命名:tabstyle,然后我们直接在RadioButton中引用即可,如下
图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    <style name="tabstyle">
        <item name="android:button">@null</item>
        <item name="android:textColor">@color/nav_text_color_selec</item>
        <item name="android:gravity">center</item>
    </style>
 
<!--下面是引用自定义样式的布局文件-->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <FrameLayout
        android:id="@+id/realtabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/main_radiogroup"
        android:layout_alignParentTop="true"/>
 
    <RadioGroup
        android:id="@+id/main_radiogroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom"
        android:gravity="bottom"
        android:orientation="horizontal" >
 
        <RadioButton
            android:id="@+id/message_radiobtn"
            android:layout_weight="1"
            android:checked="true"
            android:drawableTop="@drawable/community_main_btn"
            android:text="消息"
            style="@style/tabstyle"/>
 
        <RadioButton
            android:id="@+id/contact_radiobtn"
            android:layout_weight="1"
            android:drawableTop="@drawable/goverment_main_btn"
            android:text="联系人"
            style="@style/tabstyle"/>
 
        <RadioButton
            android:id="@+id/dynamic_radiobtn"
            android:layout_weight="1"
            android:drawableTop="@drawable/news_main_btn"
            android:text="动态"
            style="@style/tabstyle"/>
 
    </RadioGroup>
 
</RelativeLayout>

四、测试

1、在我的案例里面,主布局文件(activity_drawer_layout.xml)使用DrawerLayout,然后添加策划的一个Fragment,在FrameLayout中加载单选按钮选中的Fragment,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/id_drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="cn.teachcourse.www.DrawerLayoutActivity" >
 
    <!-- FrameLayout布局用于展示内容 -->
 
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent" >
    </FrameLayout>
 
    <!-- 直接添加侧滑菜单的MenuFragment到布局中 -->
 
    <fragment
        android:id="@+id/id_left_menu"
        android:name="cn.teachcourse.www.ui.main.MenuFragment"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:tag="LEFT" />
 
</android.support.v4.widget.DrawerLayout>

2、下面开始介绍Activity的编程,在主Activity中还算是比较简单,加载activity_drawer_layout.xml布局文件,然后获取DrawerLayout控件,控制策滑Fragment的开与关,这里可以先查以下资料,主要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drawer_layout);
 
        // 从保存中状态中获取实例化的Fragment对象
        if (savedInstanceState != null) {
            mContent = (Fragment) getSupportFragmentManager().getFragment(
                    savedInstanceState, "mContent");
        }
 
        if (mContent == null) {
 
            mContent = new ContentFragment();
            mFragment=new MainTabHostActivity();
 
        }
        // 开启事务,替换,提交
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.content_frame, mContent).commit();
        // 初始化控件
        initView();
        // 添加DrawerLayout监视器事件setDrawerListener
        initEvents();
    }
    // 当程序退出的时候,保存状态
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getSupportFragmentManager().putFragment(outState, "mContent", mContent);
    }
 
    // 开启菜单
    public void openMenu() {
        flage = true;
        mDrawerLayout.openDrawer(Gravity.LEFT);
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,
                Gravity.RIGHT);
 
    }
 
    // 关闭菜单
    public void closeMenu() {
        // TODO Auto-generated method stub
        mDrawerLayout.closeDrawers();
        flage = false;
 
    }

3、在单选项中,我们定义了三个Fragment,分别为:MessageFragment,ContactFragment和DynamicFragment,在三个Fragment中都放置一个ImageView控件,设置一张图片效果演示,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!--message_fragment.xml-->
<?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" >
 
<ImageView
    android:src="@drawable/qq_message"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="fitXY"/>
 
</LinearLayout>

同理,另外的ContactFragment、DynamicFragment布局一样,把src图片换了就行。
最终测试,效果图如下:

五、参考链接

转载转自TeachCourse博客:TeachCourse博客-做最好的安卓源码分析网站

如何使用RadioGroup和RadioButton实现FragmentTabHost导航效果?的更多相关文章

  1. Android下利用RadioGroup和RadioButton实现Tabbar的效果

    本实现方法主要使用RadioGroup和RadioButton的组合方式来实现Tabbar的效果. 其中选中的Tab的切换的动作可以通过RadioGroup的OnCheckedChangeListen ...

  2. 二、Fragment+RadioButton实现底部导航栏

    在App中经常看到这样的tab底部导航栏   那么这种效果是如何实现,实现的方式有很多种,最常见的就是使用Fragment+RadioButton去实现.下面我们来写一个例子 首先我们先在activi ...

  3. Android入门(八):使用RadioGroup 和RadioButton组件建立单选清单

    这一章,我们学习RadioGroup 和RadioButton组件,我们新建一个项目,编码过程与前几章的项目类似. 1.建立字符串资源文件strings.xml: <resources> ...

  4. Android控件之RadioGroup与RadioButton(单选控件)

    一.RadioGroup与RadioButton 1.什么是RadioGroup: RadioButton的一个集合,提供多选机制 2.什么是RadioButton: RadioButton包裹在Ra ...

  5. 使用RadioGroup与RadioButton实现多选一

    RadioGroup是RadioButton的集合, RadioGroup里面可以包含很多RadioButton,提供多选一机制,只能选择其中一个 RadioGroup的orientation(方向) ...

  6. React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton)

    React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton) 一,需求与简单介绍 在开发项目时发现RN没有给提供RadioButton和Rad ...

  7. 动态布局中RadioGroup的RadioButton有时候不相互排斥的原因

    近期在做一个答题类的模块,有单选.简答.调查问卷等,我是用动态布局的方式生成答题项的.在弄单选的时候遇到一个比較奇葩的问题,在代码中生成RadioGroup和RadioButton的时候.会发现不能相 ...

  8. Android 使用RadioGroup和RadioButton实现单选效果

    RadioButton和CheckBox的区别:CheckBox选中之后可以直接取消,RadioButton选中之后不能直接取消,所以一般情况下不建议单独使用.1.RadioGroup:RadioBu ...

  9. 简述RadioGroup和RadioButton的使用

    简述RadioGroup和RadioButton的使用 在项目中有身份选择的选项,需要用到RadioGroup和RadioButton,这里做个记录,和大家交流一下. 话不多说,一起看代码 XML代码 ...

随机推荐

  1. 瞬发大量并发连接 造成MySQL连接不响应的分析

    http://www.actionsky.com/docs/archives/252  2016年12月7日  黄炎 目录 1 现象 2 猜想 3 检查环境 4 猜想2 5 分析 5.1 TCP握手的 ...

  2. Speech to Text for iOS

    找了一下 speech to text 可以用的 SDK for iOS 以下幾種方案: NDEV Mobile (有免費方案,不過似乎不支援離線,客戶清單中有 wallmart,支援不少語言) iS ...

  3. 启动mongodb报错问题

    [root@zk-datanode-02 mongodb]# bin/mongod -f config/mongo.cnf &[1] 30549[root@zk-datanode-02 mon ...

  4. java基础篇5之泛型

    1 泛型的基本应用 //反射方式 指定类型,就不用强转 Construcctor<String> constructor = String.class.getConstructor(Str ...

  5. 转: Linux下使用java -jar运行可执行jar包的正确方式

    from:  http://codepub.cn/2016/05/11/The-correct-way-to-use-java-jar-run-an-executable-jar-package-un ...

  6. hosts.allow、hosts.deny无效查看服务是否支持tcp_Wrappers

    通过配置hosts.allow.hosts.deny,控制SSH限制固定IP登陆 按照以往的方法,分别在hosts.allow.hosts.deny加入以下配置 # more /etc/hosts.a ...

  7. vue1和vue2获取dom元素的方法 及 nextTick() 、$nextTick()

    vue1.*版本中 在标签中加上el='dom',然后在代码中this.$els.dom这样就拿到了页面元素 例如:<div class='box' el='myBox'>你好</d ...

  8. Html5上传插件封装

    前段时间将flash的上传控件替换成使用纯js实现的,在此记录 1.创建标签 <div class="camera-area" style="display:inl ...

  9. Linux 编译ffmpeg 生成ffplay

    本来主要介绍linux环境下如何编译ffmpeg使之生成ffplay.编译总是离不开源码的版本,以及编译环境下:编译环境Ubutun 16.04 ,ffmpeg 版本3.4.2.如何下载ffmpeg ...

  10. HDU 小明系列故事——师兄帮帮忙 高速幂

    小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...