You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Segmented Buttons切换Fragments?无需TabLayout/ViewPager及滑动

用分段按钮实现无TabLayout/ViewPager的Fragment切换

分段按钮切换Fragment示例

一、核心思路

不用TabLayout和ViewPager,我们可以用RadioGroup + RadioButton实现分段按钮效果,配合FrameLayout作为Fragment容器,通过监听单选按钮的选中状态切换对应Fragment(推荐用hide/show方式,避免Fragment反复重建)。

二、步骤实现

1. 编写布局文件

在Activity布局里,顶部放RadioGroup作为分段按钮组,下方放FrameLayout作为Fragment容器:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- 分段按钮组 -->
    <RadioGroup
        android:id="@+id/segmented_group"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:background="@drawable/segmented_bg"
        android:orientation="horizontal"
        android:padding="2dp">

        <RadioButton
            android:id="@+id/btn_tab1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/segmented_btn_selector"
            android:button="@null"
            android:gravity="center"
            android:paddingVertical="10dp"
            android:text="Tab 1"
            android:textColor="@drawable/segmented_text_selector"
            android:textSize="16sp" />

        <RadioButton
            android:id="@+id/btn_tab2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/segmented_btn_selector"
            android:button="@null"
            android:gravity="center"
            android:paddingVertical="10dp"
            android:text="Tab 2"
            android:textColor="@drawable/segmented_text_selector"
            android:textSize="16sp" />

        <RadioButton
            android:id="@+id/btn_tab3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/segmented_btn_selector"
            android:button="@null"
            android:gravity="center"
            android:paddingVertical="10dp"
            android:text="Tab 3"
            android:textColor="@drawable/segmented_text_selector"
            android:textSize="16sp" />
    </RadioGroup>

    <!-- Fragment容器 -->
    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

2. 自定义分段按钮样式

需要4个drawable文件实现配图视觉效果:

(1)分段按钮组背景 segmented_bg.xml

实现圆角边框:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#F5F5F5" />
    <corners android:radius="8dp" />
    <stroke
        android:width="1dp"
        android:color="#E0E0E0" />
</shape>

(2)单个按钮状态选择器 segmented_btn_selector.xml

控制选中/未选中背景:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/segmented_btn_selected" android:state_checked="true" />
    <item android:drawable="@android:color/transparent" android:state_checked="false" />
</selector>

(3)选中按钮背景 segmented_btn_selected.xml

选中时的填充背景:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF" />
    <corners android:radius="6dp" />
    <stroke
        android:width="1dp"
        android:color="#E0E0E0" />
</shape>

(4)文字颜色选择器 segmented_text_selector.xml

控制选中/未选中文字颜色:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#2196F3" android:state_checked="true" />
    <item android:color="#757575" android:state_checked="false" />
</selector>

3. 实现Fragment切换逻辑

在Activity中提前初始化所有Fragment,通过hide/show切换以保留状态:

class MainActivity : AppCompatActivity() {
    private lateinit var fragment1: Fragment1
    private lateinit var fragment2: Fragment2
    private lateinit var fragment3: Fragment3
    private lateinit var currentFragment: Fragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 初始化Fragment实例
        fragment1 = Fragment1()
        fragment2 = Fragment2()
        fragment3 = Fragment3()

        // 默认加载第一个Fragment
        supportFragmentManager.beginTransaction()
            .add(R.id.fragment_container, fragment3)
            .add(R.id.fragment_container, fragment2)
            .add(R.id.fragment_container, fragment1)
            .hide(fragment2)
            .hide(fragment3)
            .commit()
        currentFragment = fragment1
        findViewById<RadioButton>(R.id.btn_tab1).isChecked = true

        // 设置分段按钮选中监听
        findViewById<RadioGroup>(R.id.segmented_group).setOnCheckedChangeListener { _, checkedId ->
            when (checkedId) {
                R.id.btn_tab1 -> switchFragment(fragment1)
                R.id.btn_tab2 -> switchFragment(fragment2)
                R.id.btn_tab3 -> switchFragment(fragment3)
            }
        }
    }

    // 切换Fragment核心方法
    private fun switchFragment(targetFragment: Fragment) {
        if (currentFragment == targetFragment) return
        supportFragmentManager.beginTransaction()
            .hide(currentFragment)
            .show(targetFragment)
            .commit()
        currentFragment = targetFragment
    }
}

三、关键细节说明

  • RadioGroup天然支持单选,完美匹配分段按钮的交互逻辑;
  • hide/show比replace更高效,能保留Fragment的状态(比如输入框内容、滚动位置);
  • 自定义drawable可完全匹配配图样式,你可以根据需求调整颜色、圆角大小等参数。

内容的提问来源于stack exchange,提问作者Dev_Cob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:30:55