ドロップダウンサンプル

スポンサーリンク
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import com.example.app.R  // R ファイルのパスを変更してください

enum class DropdownOption {
    WORKER, STUDENT, OTHER;

    @Composable
    fun getLabel(): String {
        return when (this) {
            WORKER -> stringResource(R.string.dropdown_option_worker)
            STUDENT -> stringResource(R.string.dropdown_option_student)
            OTHER -> stringResource(R.string.dropdown_option_other)
        }
    }

    companion object {
        @Composable
        fun fromLabel(label: String): DropdownOption? {
            return values().find { it.getLabel() == label }
        }
    }
}

class MainViewModel : ViewModel() {
    private val _selectedDropdownOption = MutableStateFlow<DropdownOption?>(null)
    val selectedDropdownOption: StateFlow<DropdownOption?> = _selectedDropdownOption

    fun onDropdownItemSelected(item: String) {
        val option = DropdownOption.fromLabel(item)
        _selectedDropdownOption.value = option

        // "学生" (DropdownOption.STUDENT) が選択された場合、金額を 0 にしてボタンを非活性化
        if (option == DropdownOption.STUDENT) {
            _amount.value = "0"
        }

        updateButtonState()
    }
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DropdownMenuComponent(selectedItem: DropdownOption?, onItemSelected: (String) -> Unit) {
    var expanded by remember { mutableStateOf(false) }
    val items = DropdownOption.values().map { it.getLabel() }
    val placeholder = stringResource(R.string.dropdown_placeholder)

    ExposedDropdownMenuBox(
        expanded = expanded,
        onExpandedChange = { expanded = !expanded }
    ) {
        TextField(
            value = selectedItem?.getLabel() ?: placeholder,
            onValueChange = {},
            readOnly = true,
            modifier = Modifier
                .menuAnchor(MenuAnchorType.Primary)
                .fillMaxWidth(),
            trailingIcon = {
                ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded)
            }
        )

        ExposedDropdownMenu(
            expanded = expanded,
            onDismissRequest = { expanded = false }
        ) {
            items.forEach { item ->
                DropdownMenuItem(
                    text = { Text(item) },
                    onClick = {
                        onItemSelected(item)
                        expanded = false
                    }
                )
            }
        }
    }
}

DropdownMenuComponent(
    selectedItem = selectedDropdownOption,
    onItemSelected = viewModel::onDropdownItemSelected
)

コメント

タイトルとURLをコピーしました