tabFragment切换避免页面重叠

使用FrameLayout配合add/hide方法切换Fragment避免页面重叠,而不是使用replace导致资源浪费和页面重叠问题。在AndroidManifest.xml中为对应Activity添加android:configChanges = "orientation|screenSize"属性,并在Fragment内重写onConfigurationChanged方法,解决横竖屏切换时的界面重叠。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

viewpager+fragment也可以实现切换fragment,但是这次使用的是一个FrameLayout去切换不同的fragment


采用的是add hide的办法去隐藏fragment和显示fragment,使用replace方法是销毁上一个fragment,去加载另一个fragment,这种方法google都不是推荐的

用replace容易出现页面重叠的问题,而且我们去切换fragment的时候会重新创建一个fragment,这样每次都要获取一下数据,使得app卡顿,耗资源,每次都获取新数据对于用户来说也是流量的问题,这样弊端很大。


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Fragment fragment1, fragment2;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.rb_one).setOnClickListener(this);
        findViewById(R.id.rb_two).setOnClickListener(this);
        setTabSelect(0);
    }

    public void setTabSelect(int i) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        switch (i) {
            case 0:
                fragment1 = manager.findFragmentByTag("TAG1");
                hideTab(transaction);
                if (fragment1 == null) {
                    fragment1 = new Fragment1();
                    transaction.add(R.id.fragment, fragment1, "TAG1");
                } else {
                    transaction.show(fragment1);
                }

                break;
            case 1:
                fragment2 = manager.findFragmentByTag("TAG2");
                hideTab(transaction);
                if (fragment2 == null) {
                    fragment2 = new Fragment2();
                    transaction.add(R.id.fragment, fragment2, "TAG2");
                } else {
                    transaction.show(fragment2);
                }
                break;
        }

        transaction.commit();
    }


    private void hideTab(FragmentTransaction transaction) {
        if (fragment1 != null) {
            transaction.hide(fragment1);
        }
        if (fragment2 != null) {
            transaction.hide(fragment2);
        }
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.rb_one:
                setTabSelect(0);
                break;

            case R.id.rb_two:
                setTabSelect(1);
                break;

        }
    }
}

这样我们去隐藏或者显示界面就不会出现页面重叠的问题,而且避免了每次切换页面的时候都要重新获取一下数据的问题。

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

    <FrameLayout
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/rg_group" />

    <RadioGroup
        android:id="@+id/rg_group"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/rb_one"
            style="@style/TabBottomStyle"
            android:checked="true"
            android:text="页面一" />

        <RadioButton
            android:id="@+id/rb_two"
            style="@style/TabBottomStyle"
            android:text="页面二" />

    </RadioGroup>
</RelativeLayout>

最后发现横竖屏切换的时候还是会出现页面重叠的问题,解决办法是AndroidManifest.xml文件下的对应的activity添加android:configChanges = "orientation|screenSize"这个属性,并在在fragment里面重写onConfigurationChanged这个方法,里面什么都不操作。就可以避免横竖屏切换时的界面重叠问题


Demo链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值