Fragment与Radiogroup联动,经典的主界面布局。使用show和hide的方式实现;
2018-03-27 15:23
731 查看
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"&
109c8
gt;@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
相关文章推荐
- 使用ViewPager+Fragment+RadioGroup实现类似微信主界面
- 使用Fragment和RadioGroup实现类似ios的tabbar的效果
- 使用ViewPager+RadioGroup+Fragment实现类似微信的底部导航
- Android UI-实现底部切换标签之方式一 ──fragment(底部采用radioGroup+radiobutton)添加5个子fragment
- 使用DrawerLayout实现侧滑菜单,,RadioButton+Fragment实现页面主布局,首页面使用tabLayout+viewPager实现
- RadioGroup+Fragment实现主界面框架Demo
- ViewPager+Fragment+RadioGroup实现页面联动\点击切换
- android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态
- 使用RadioGroup+ViewPager+Fragment实现带滑动的页卡效果TabHost时遇到的问题
- 如何使用RadioGroup和RadioButton实现FragmentTabHost导航效果?
- Android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态
- Fragment加RadioGroup show和hide
- Android中使用RadioGroup实现Fragment的切换
- ViewPager,RadioGroup,FragmentManager 详解 <二> 主菜单 RadioGroup 和ViewPager 实现联动
- 使用hide和show方法来实现fragment的切换时当需要fragment重新刷新
- android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态
- Android UI-实现底部切换标签之方式二 ──Activity(底部采用radioGroup+rutton)添加5个子fragment
- Android 使用ViewPager和RadioGroup配合Fragment实现标签页,可点击按钮切换、滑动切换。
- android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态
- android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态