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

如何在Kotlin和Jetpack Compose中可视化选择枚举值?

在Jetpack Compose中实现枚举值的分段选择器

方法一:使用Material3的SegmentedButtonRow(推荐)

这是Jetpack Compose中对应SwiftUI SegmentedPickerStyle 的官方组件,适配Material3设计规范,视觉和交互效果与你需要的完全一致。

1. 定义Kotlin枚举类

先将iOS端的枚举转换为Kotlin枚举,可选添加友好显示文本:

enum class Categories {
    Womens, Mens, Mixed;

    // 自定义显示文本(如果需要和枚举原始名称区分)
    val displayName: String
        get() = when(this) {
            Womens -> "女装"
            Mens -> "男装"
            Mixed -> "混合"
        }
}

2. 实现分段选择器

结合mutableStateOf管理选中状态,用SegmentedButtonRow和SegmentedButton构建组件:

import androidx.compose.foundation.layout.padding
import androidx.compose.material3.SegmentedButton
import androidx.compose.material3.SegmentedButtonRow
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

@Composable
fun CategorySegmentedPicker() {
    // 管理选中的枚举状态
    var selectedCategory by remember { mutableStateOf(Categories.Womens) }

    SegmentedButtonRow(modifier = Modifier.padding(16.dp)) {
        Categories.values().forEach { category ->
            SegmentedButton(
                selected = selectedCategory == category,
                onClick = { selectedCategory = category }
            ) {
                Text(text = category.displayName)
            }
        }
    }

    // 可选:展示当前选中结果
    Text(
        text = "当前选中:${selectedCategory.displayName}",
        modifier = Modifier.padding(16.dp)
    )
}

方法二:使用Material2的TabRow(兼容旧版)

如果项目仍使用Material2,可通过TabRow实现类似效果:

import androidx.compose.foundation.layout.padding
import androidx.compose.material.Tab
import androidx.compose.material.TabRow
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

@Composable
fun CategoryTabPicker() {
    var selectedIndex by remember { mutableStateOf(0) }
    val categories = Categories.values()

    TabRow(selectedTabIndex = selectedIndex) {
        categories.forEachIndexed { index, category ->
            Tab(
                selected = selectedIndex == index,
                onClick = { selectedIndex = index },
                text = { Text(category.displayName) }
            )
        }
    }

    // 可选:展示当前选中结果
    Text(
        text = "当前选中:${categories[selectedIndex].displayName}",
        modifier = Modifier.padding(16.dp)
    )
}

复用适配其他枚举

上述逻辑可直接复用给Leagues、Divisions等其他枚举,比如:

enum class Leagues {
    Premier, Championship, LeagueOne;

    val displayName: String
        get() = when(this) {
            Premier -> "英超"
            Championship -> "英冠"
            LeagueOne -> "英甲"
        }
}

@Composable
fun LeagueSegmentedPicker() {
    var selectedLeague by remember { mutableStateOf(Leagues.Premier) }

    SegmentedButtonRow(modifier = Modifier.padding(16.dp)) {
        Leagues.values().forEach { league ->
            SegmentedButton(
                selected = selectedLeague == league,
                onClick = { selectedLeague = league }
            ) {
                Text(text = league.displayName)
            }
        }
    }
}

实现后,你只需在选中状态变化时,用当前枚举值过滤数据数组即可完成业务逻辑。

内容的提问来源于stack exchange,提问作者Zonker.in.Geneva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:52:16