Fragment+RadioGroup经典的主界面布局,方便实用;


1、使用replace方式:

直接上代码,先是布局文件;

<?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">

    <RelativeLayout
        android:id="@+id/rl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="#ffffff">

        <RadioGroup
            android:id="@+id/rg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:orientation="horizontal">

            <RadioButton
                android:id="@+id/rb_home"
                style="@style/main_tab_button"
                android:drawableTop="@drawable/rgbtn_home_select"
                android:text="主页"/>

            <RadioButton
                android:id="@+id/rb_shoppingcart"
                style="@style/main_tab_button"
                android:drawableTop="@drawable/rgbtn_gouwuche_select"
                android:text="购物车"/>

            <RadioButton
                android:id="@+id/rb_orderfrom"
                style="@style/main_tab_button"
                android:drawableTop="@drawable/rgbtn_orderfrom_select"
                android:text="分类"/>

            <RadioButton
                android:id="@+id/rb_my"
                style="@style/main_tab_button"
                android:drawableTop="@drawable/rgbtn_my_select"
                android:text="个人"/>
        </RadioGroup>
        <View
            style="@style/Line_e0e0e0_Horizontal"/>
    </RelativeLayout>
    <FrameLayout
        android:id="@+id/fl"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/rl"
        ></FrameLayout>
</RelativeLayout>

Radiogroup的style:

<style name="main_tab_button">
    <item name="android:textSize">12dp</item>
    <item name="android:textColor">@drawable/rgbtn_select</item>
    <item name="android:ellipsize">marquee</item>
    <item name="android:gravity">center</item>
    <item name="android:paddingBottom">2dp</item>
    <item name="android:background">#ffffff</item>
    <item name="android:layout_width">0dp</item>
    <item name="android:layout_weight">1.0</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:button">@null</item>
    <item name="android:singleLine">true</item>
    <item name="android:drawablePadding">2dp</item>
</style>

文字的状态选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#666666" android:state_checked="false"/>
    <item android:color="#424242" android:state_checked="true"/>
</selector>

图片状态选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/datahui_def" android:state_checked="false"/>
    <item android:drawable="@drawable/datahui_sel" android:state_checked="true"/>
</selector>

好了,核心代码:

public class FragmentReplaceActivity extends AppCompatActivity {@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(getContentViewResource());
        initView();
        initData();
        initList();
    }private RadioGroup rg;
    private Fragment HomeFm = null,SpcFm = null, OrderFm = null, MyFm = null;

    private final class RadioGroupOnCheckedChangeListener implements RadioGroup.OnCheckedChangeListener {@Override
        public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {/**
             * 替换fragment
             */
            switch (checkedId) {case R.id.rb_home:getSupportFragmentManager().beginTransaction().replace(R.id.fl, HomeFm).commit();
                    break;
                case R.id.rb_shoppingcart:getSupportFragmentManager().beginTransaction().replace(R.id.fl, SpcFm).commit();
                    break;
                case R.id.rb_orderfrom:getSupportFragmentManager().beginTransaction().replace(R.id.fl, OrderFm).commit();
                    break;
                case R.id.rb_my:getSupportFragmentManager().beginTransaction().replace(R.id.fl, MyFm).commit();
                    break;
            }}}public int getContentViewResource() {return R.layout.activity_fragment;
    }protected void initView() {rg = findViewById(R.id.rg);
    }protected void initData() {HomeFm  = new Fragment1();
        SpcFm = new Fragment2();
        OrderFm = new Fragment3();
        MyFm = new Fragment4();
    }protected void initList() {rg.setOnCheckedChangeListener(new RadioGroupOnCheckedChangeListener());
        rg.check(R.id.rb_home);
    }
}

这样,一个简单的使用replace点击切换界面就好了;不过这样的方式不太好,每次切换都要走一遍fragment中所有的方法,好来介绍下一种:

2、Add,Show,Hide;隐藏和显示fragment;

public class FragmentShowHideActivity extends AppCompatActivity {@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(getContentViewResource());
        initView();
        initData();
        initList();
    }private FrameLayout fl;
    private RadioGroup rg;
    private Fragment HomeFm = null,SpcFm = null, OrderFm = null, MyFm = null;

    private final class RadioGroupOnCheckedChangeListener implements RadioGroup.OnCheckedChangeListener {@Override
        public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {if (HomeFm != null) {getSupportFragmentManager().beginTransaction().hide(HomeFm).commit();
            }if (SpcFm != null) {getSupportFragmentManager().beginTransaction().hide(SpcFm).commit();
            }if (OrderFm != null) {getSupportFragmentManager().beginTransaction().hide(OrderFm).commit();
            }if (MyFm != null) {getSupportFragmentManager().beginTransaction().hide(MyFm).commit();
            }switch (checkedId) {case R.id.rb_home:if (HomeFm == null) {HomeFm = new Fragment1();
                        getSupportFragmentManager().beginTransaction().add(R.id.fl, HomeFm).commit();
                    } else {getSupportFragmentManager().beginTransaction().show(HomeFm).commit();
                    }break;
                case R.id.rb_shoppingcart:if (SpcFm == null) {SpcFm = new Fragment2();
                        getSupportFragmentManager().beginTransaction().add(R.id.fl, SpcFm).commit();
                    } else {getSupportFragmentManager().beginTransaction().show(SpcFm).commit();
                    }break;

                case R.id.rb_orderfrom:if (OrderFm == null) {OrderFm = new Fragment3();
                        getSupportFragmentManager().beginTransaction().add(R.id.fl, OrderFm).commit();
                    } else {getSupportFragmentManager().beginTransaction().show(OrderFm).commit();
                    }break;
                case R.id.rb_my:if (MyFm == null) {MyFm = new Fragment4();
                        getSupportFragmentManager().beginTransaction().add(R.id.fl, MyFm).commit();
                    } else {getSupportFragmentManager().beginTransaction().show(MyFm).commit();
                    }break;
            }}}public int getContentViewResource() {return R.layout.activity_fragment;
    }protected void initView() {fl = findViewById(R.id.fl);
        rg = findViewById(R.id.rg);

    }protected void initData() {}protected void initList() {rg.setOnCheckedChangeListener(new RadioGroupOnCheckedChangeListener());
        rg.check(R.id.rb_home);
    }
}

简化一下是这样的:使用isAdded方法判断是否添加过;

public class FragmentShowHide2Activity extends AppCompatActivity {@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(getContentViewResource());
        initView();
        initData();
        initList();
    }private RadioGroup rg;
    private Fragment HomeFm = null,SpcFm = null, OrderFm = null, MyFm = null;

    private final class RgOnCheckedChangeListener implements RadioGroup.OnCheckedChangeListener {@Override
        public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {switch (checkedId) {case R.id.rb_home:switchFragment(showFragment,HomeFm);
                    break;
                case R.id.rb_shoppingcart:switchFragment(showFragment,SpcFm);
                    break;
                case R.id.rb_orderfrom:switchFragment(showFragment,OrderFm);
                    break;
                case R.id.rb_my:switchFragment(showFragment,MyFm);
                    break;
            }}}public int getContentViewResource() {return R.layout.activity_fragment;
    }protected void initView() {rg = findViewById(R.id.rg);

    }protected void initData() {HomeFm  = new Fragment1();
        SpcFm = new Fragment2();
        OrderFm = new Fragment3();
        MyFm = new Fragment4();
    }protected void initList() {rg.setOnCheckedChangeListener(new RgOnCheckedChangeListener());
        rg.check(R.id.rb_home);
    }private Fragment showFragment;  //当前显示的fragment

    private void switchFragment(Fragment hide,Fragment show){FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        if (hide == show)return;
        if (hide != null){if (!show.isAdded()){ft.hide(hide).add(R.id.fl, show).commit();
            }else{ft.hide(hide).show(show).commit();
            }}else {if (!show.isAdded()){ft.add(R.id.fl, show).commit();
            }else{ft.show(show).commit();
            }}showFragment = show;
    }
}

下载Demo:FragmentDemo

github:Github

附:使用show和hide的方式显示Fragment,在Activity回收后重叠的问题;

随意门:https://blog.csdn.net/qq_35605213/article/details/79713871

转载于:https://www.cnblogs.com/cuichen16/p/10786009.html

Fragment与Radiogroup联动,经典的主界面布局。使用show和hide的方式实现;相关推荐

  1. 基于数据挖掘的旅游推荐APP(二):主界面布局

    主界面布局通过Fragment实现,底部类似于Tab选项卡,效果如下: 底部导航栏是借鉴GitHub上的一个项目,不对,其实就是抄的.附上原地址链接,把库引进来直接用就行了.下面上代码: activi ...

  2. easyui主界面布局easyui-layout用法一例

    easyui主界面布局easyui-layout用法一例 例一: <body id="topBody" style="padding: 0px 0px 0px 0p ...

  3. 在线拍卖系统后台,主界面布局,逻辑

    这里写自定义目录标题 主界面布局 菜单栏&逻辑(未设置样式) 主界面布局 布局依旧采用的是大众款,(标题栏+菜单栏+主界面),因没设置资源字典,这里不多说,直接上代码吧 <Window ...

  4. Android项目:手机安全卫士(3)—— 主界面布局

    Android项目:手机安全卫士(3)-- 主界面布局 1 总纲 前面实现了"手机安全卫士"的闪屏界面与版本检测升级问题,接下来的任务就是实现主界面了,这个相对简单,因为没有涉及到 ...

  5. 【原】WPF 主界面布局中DockPanel的停靠与默认填充

    在WPF中,通常的主界面大都是DockPanel 根元素,一次DockPanel .Top主菜单.DockPanel .Top Toolbar.DockPanel .Bottom Statusbar, ...

  6. Android疯狂猜歌游戏之---------主界面布局

    第一小节链接: http://www.imooc.com/wenda/detail/256551

  7. (仿头条APP项目)2.主界面按钮切换Fragment页面

    文章目录 主界面按钮切换Fragment页面 效果展示 框架结构 xml视图 主视图 选择器和style java代码模块 创建4个Fragment 1.绑定按钮选择事件 2.初始化和用HashMap ...

  8. 新增我的推荐歌单、通过ViewPager2+RadioGroup重构主界面( 简易音乐 六)

    新增我的推荐歌单.通过ViewPager2+RadioGroup重构主界面( 简易音乐 六) 关于 效果 添加Api接口 重构主界面 新增推荐歌单功能 新增推荐歌单适配器 关于   在本篇开始之前,我 ...

  9. Android 11.0 Settings源码分析 - 主界面加载

    Android 11.0 Settings源码分析 - 主界面加载 本篇主要记录AndroidR Settings源码主界面加载流程,方便后续工作调试其流程. Settings代码路径: packag ...

  10. Android学习系列(22)--App主界面比较

    本文算是一篇漫谈,谈一谈当前几个流行应用的主界面布局,找个经典的布局我们自己也来实现一个. 不是为了追求到底有多难,而是为了明白我们确实需要这么做.  走个题,android的UI差异化市场依然很大, ...

最新文章

  1. WCF - 基础介绍
  2. Quartz1.X中CronTrigger第一次启动的问题
  3. 与众不同 windows phone (32) - Communication(通信)之任意源组播 ASM(Any Source Multicast)...
  4. 机器学习笔记:为什么要对数据进行归一化处理?
  5. JAVASE内测试题
  6. 高达82 fps的实时文本检测,华科AAAI2020提出可微分二值化模块
  7. PointNet论文笔记
  8. 各j2ee web层框架比较(转)
  9. [面试]synchronized
  10. 联想小新air13pro重装系统_小新air13pro改win7系统 联想小新air13pro安装win7系统教程...
  11. 智能家居离线语音识别控制系统设计(SU-03T)
  12. 【Android】aapt2报错:windows W/ziparchive( 2348): Unable to open ‘badging‘: No such file or directory
  13. html a5 尺寸,纸型尺寸大小(A1,A2,A3,A4,A5,A6,B1,B2,B3,B4,B5......)
  14. 五、dynamic类型
  15. 杭州-SQL杭州国迈软件有限公司笔试题
  16. Python基础练习题目
  17. iphone充电图_为什么我的iPhone无法充电?
  18. CENTOS 7 安装 ORACLE 19C
  19. H5C3动画实例,通过基于jQuery的fullpage插件完成
  20. Wi-Fi Mesh协议(1)

热门文章

  1. 二进制编译安装mysql(centos6、7)和源码编译bind
  2. STM32CubeMX使用(三)之DMA使用SPI
  3. 斜率优化dp学习笔记
  4. # 国王游戏(贪心+大数乘除+微扰法证明)
  5. win10设置Python程序定时运行(设置计划任务)
  6. 创建数据库和表的SQL语句
  7. ubuntu命令整理中
  8. js实现多个图片淡入淡出,框架
  9. 做一款仿映客的直播App
  10. MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限(转)