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
)
コメント