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

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

  1. 基于easyUI实现经典系统主界面

    此文章是基于 EasyUI+Knockout实现经典表单的查看.编辑 一. 相关文件介绍 1. home.jsp:系统主界面 <!DOCTYPE html PUBLIC "-//W3C ...

  2. android actionbar viewpager 实现类微信主界面布局

    1 Activity public class MainActivity extends FragmentActivity { private ViewPager pager; private Act ...

  3. Swift实战-小QQ(第3章):QQ主界面布局

    1.导航栏外观设定*在AppDelegate.swift文件中的didFinishLaunchingWithOptions方法添加以下代码 func application(application: ...

  4. jquery+easyui主界面布局一例

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="workbench.aspx ...

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

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

  6. Android学习系列(23)--App主界面实现

    在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下 ...

  7. 看过《大湿教我写.net通用权限框架(1)之菜单导航篇》之后发生的事(续)——主界面

    引言 在UML系列学习中的小插曲:看过<大湿教我写.net通用权限框架(1)之菜单导航篇>之后发生的事 在上篇中只拿登录界面练练手,不把主界面抠出来,实在难受,严重的强迫症啊.之前一直在总 ...

  8. Android应用经典主界面框架之中的一个:仿QQ (使用Fragment, 附源代码)

    备注:代码已传至https://github.com/yanzi1225627/FragmentProject_QQ 欢迎fork,如今来审视这份代码,非常多地方写的不太好,欢迎大家指正.有时间我会继 ...

  9. Android应用经典主界面框架之二:仿网易新闻client、CSDN client (Fragment ViewPager)

    另外一种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表.使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View.而是Fragment.所 ...

随机推荐

  1. MySQL中如何实现 select top n

    mysql 没有 top n 语法,mysql 用 limit 来实现相关功能,而且功能更加强大. 语法: SELECT * FROM table LIMIT [offset,] rows | row ...

  2. DP-动态规划算法实例:拿糖果问题

    拿糖果问题 问题描述 妈妈给小B买了N块糖!但是她不允许小B直接吃掉. 假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数.这时,妈妈就会在小B拿了P块糖以后再从糖堆里拿走 ...

  3. C# 委托、lambda表达式和事件

    什么是委托?委托就是持有一个或多个方法的对象,并且该对象可以执行,可以传递. using System; using System.Collections.Generic; using System. ...

  4. 排序算法<No.7>【希尔排序】

    排序算法进入到第7篇,这个也还是比较基础的一种,希尔排序,该排序算法,是依据该算法的发明人donald shell的名字命名的.1959年,shell基于传统的直接插入排序算法,对其性能做了下提升,其 ...

  5. 【java】类的初识

    面向过程思想:强调的是功能行为 面向对象思想:不自己亲自做,将功能封装为对象,强调具备功能的对象,指挥对象实现各种功能.以后开发实际就是找对象使用对象,要是对象没有就创建对象并维护对象. 面向对象的三 ...

  6. 使用vivado将bit文件转化为mcs文件

    使用vivado将bit文件转化为mcs文件 1.在Tcl Console中运行脚本: write_cfgmem -force -format MCS -size 64 -interface spix ...

  7. PCM简介

    1. 差分脉冲编码调制 如果两个相邻抽样值之间的相关性很大,那么它们的差值就较小,这样,仅对差值量化可以使用较少的比特数,此即差分PCM,或DPCM. 为了理论方便,我们将采样和量化分开,并用不带上三 ...

  8. ALGO-120_蓝桥杯_算法训练_学做菜

    问题描述 涛涛立志要做新好青年,他最近在学做菜.由于技术还很生疏,他只会用鸡蛋,西红柿,鸡丁,辣酱这四种原料来做菜,我们给这四种原料标上字母A,B,C,D. 涛涛现在会做的菜有五种: . 西红柿炒鸡蛋 ...

  9. ALGO-22_蓝桥杯_算法训练_数的划分(DP)

    问题描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=,k=,下面三种分法被认为是相同的. ,,; ,,; ,,; 问有多少种不同的分法. 输入格式 n,k 输出格式 ...

  10. ALGO-13_蓝桥杯_算法训练_拦截导弹(贪心,DP)

    问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...