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.csdn.net/qq_35605213/article/details/79713871


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值