package com.example.anohi import android.os.Build import android.os.Bundle import android.text.Selection import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.annotation.RequiresApi import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.example.anohi.ui.theme.AnohiTheme import kotlinx.datetime.LocalDate import kotlinx.datetime.toJavaLocalDate import kotlinx.datetime.toKotlinLocalDate import io.github.boguszpawlowski.composecalendar.SelectableCalendar import io.github.boguszpawlowski.composecalendar.kotlinxDateTime.now import io.github.boguszpawlowski.composecalendar.rememberSelectableCalendarState import io.github.boguszpawlowski.composecalendar.selection.DynamicSelectionState import io.github.boguszpawlowski.composecalendar.selection.SelectionMode import io.github.boguszpawlowski.composecalendar.selection.SelectionState import kotlinx.coroutines.* class MainActivity : ComponentActivity() { @RequiresApi(Build.VERSION_CODES.O) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AnohiTheme { // A surface container using the 'background' color from the theme Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { KotlinXDateTimeSample() } } } } @RequiresApi(Build.VERSION_CODES.O) @Composable fun KotlinXDateTimeSample() { var selection by remember { mutableStateOf(emptyList<LocalDate>()) } Column { DateTimeCalendar( today = LocalDate.now(), onSelectionChanged = { selection = it }, dayContent = { DayContent(dayState = it) }, ) Spacer(modifier = Modifier.height(16.dp)) Text( text = "Selection: ${selection.joinToString { it.toString() }}", style = MaterialTheme.typography.titleLarge, ) } } @Composable fun BoxScope.DayContent( dayState: KotlinDayState<DynamicSelectionState>, ) { val isSelected = dayState.selectionState.isDateSelected(dayState.date) Text( text = dayState.date.dayOfMonth.toString(), modifier = Modifier .fillMaxWidth() .align(Alignment.Center) .aspectRatio(1f) .clickable { dayState.selectionState.onDateSelected(dayState.date) }, color = if (isSelected) Color.Red else Color.Unspecified, textAlign = TextAlign.Center, style = MaterialTheme.typography.headlineLarge, ) } @RequiresApi(Build.VERSION_CODES.O) @Composable fun DateTimeCalendar( today: LocalDate, onSelectionChanged: (List<LocalDate>) -> Unit, dayContent: @Composable BoxScope.(KotlinDayState<DynamicSelectionState>) -> Unit, ) { SelectableCalendar( calendarState = rememberSelectableCalendarState( confirmSelectionChange = { selection -> onSelectionChanged(selection.map { it.toKotlinLocalDate() }); true /* 二個以上真の場合おわりにしたい。*/}, initialSelectionMode = SelectionMode.Period, ), today = today.toJavaLocalDate(), showAdjacentMonths = false, dayContent = { dayState -> dayContent( KotlinDayState( date = dayState.date.toKotlinLocalDate(), isCurrentDay = dayState.isCurrentDay, selectionState = dayState.selectionState, ) ) } ) } data class KotlinDayState<T : SelectionState>( val date: LocalDate, val isCurrentDay: Boolean, val selectionState: T, ) private fun SelectionState.isDateSelected(date: LocalDate) = isDateSelected(date.toJavaLocalDate()) private fun SelectionState.onDateSelected(date: LocalDate) = onDateSelected(date.toJavaLocalDate()) }
SelectionMode.Periodで連続を意味することはわかったんですがconfirmSelectionChange の後に
;val x ={ selection.count(true) };if (x >= 2){selection -> false} }
みたいに次から次へと選択範囲が増えないようにしたいのですがどうしたらいいでしょうか?
あなたの回答
tips
プレビュー