Fragment与Radiogroup联动,经典的主界面布局。使用show和hide的方式实现;
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.****.net/qq_35605213/article/details/79713871