質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

0回答

614閲覧

jetpack composeのカレンダーで範囲選択

Bolshikh_i_mal

総合スコア32

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2022/06/20 15:19

編集2022/06/21 12:29
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} }

みたいに次から次へと選択範囲が増えないようにしたいのですがどうしたらいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問