16
16
17
17
package com.example.compose.jetsurvey.survey
18
18
19
+ import androidx.compose.foundation.BorderStroke
19
20
import androidx.compose.foundation.ScrollableColumn
20
21
import androidx.compose.foundation.Text
21
22
import androidx.compose.foundation.background
22
23
import androidx.compose.foundation.clickable
24
+ import androidx.compose.foundation.layout.Arrangement
23
25
import androidx.compose.foundation.layout.Column
24
26
import androidx.compose.foundation.layout.PaddingValues
25
27
import androidx.compose.foundation.layout.Row
@@ -37,6 +39,7 @@ import androidx.compose.material.ProvideEmphasis
37
39
import androidx.compose.material.RadioButton
38
40
import androidx.compose.material.RadioButtonConstants
39
41
import androidx.compose.material.Slider
42
+ import androidx.compose.material.Surface
40
43
import androidx.compose.runtime.Composable
41
44
import androidx.compose.runtime.getValue
42
45
import androidx.compose.runtime.mutableStateOf
@@ -49,27 +52,6 @@ import androidx.compose.ui.unit.dp
49
52
import androidx.ui.tooling.preview.Preview
50
53
import com.example.compose.jetsurvey.R
51
54
import com.example.compose.jetsurvey.theme.JetsurveyTheme
52
- import com.example.compose.jetsurvey.theme.questionBackground
53
-
54
- @Preview
55
- @Composable
56
- fun QuestionPreview () {
57
- val question = Question (
58
- id = 2 ,
59
- questionText = R .string.pick_superhero,
60
- answer = PossibleAnswer .SingleChoice (
61
- optionsStringRes = listOf (
62
- R .string.spiderman,
63
- R .string.ironman,
64
- R .string.unikitty,
65
- R .string.captain_planet
66
- )
67
- )
68
- )
69
- JetsurveyTheme {
70
- Question (question = question, answer = null , onAnswer = {}, onAction = { _, _ -> })
71
- }
72
- }
73
55
74
56
@Composable
75
57
fun Question (
@@ -84,9 +66,14 @@ fun Question(
84
66
contentPadding = PaddingValues (start = 20 .dp, end = 20 .dp)
85
67
) {
86
68
Spacer (modifier = Modifier .preferredHeight(44 .dp))
69
+ val backgroundColor = if (MaterialTheme .colors.isLight) {
70
+ MaterialTheme .colors.onSurface.copy(alpha = 0.04f )
71
+ } else {
72
+ MaterialTheme .colors.onSurface.copy(alpha = 0.06f )
73
+ }
87
74
Row (
88
75
modifier = Modifier .fillMaxWidth().background(
89
- color = MaterialTheme .colors.questionBackground ,
76
+ color = backgroundColor ,
90
77
shape = MaterialTheme .shapes.small
91
78
)
92
79
) {
@@ -99,6 +86,17 @@ fun Question(
99
86
}
100
87
}
101
88
Spacer (modifier = Modifier .preferredHeight(24 .dp))
89
+ if (question.description != null ) {
90
+ ProvideEmphasis (emphasis = AmbientEmphasisLevels .current.medium) {
91
+ Text (
92
+ text = stringResource(id = question.description),
93
+ style = MaterialTheme .typography.caption,
94
+ modifier = Modifier
95
+ .fillMaxWidth()
96
+ .padding(bottom = 24 .dp, start = 8 .dp, end = 8 .dp)
97
+ )
98
+ }
99
+ }
102
100
when (question.answer) {
103
101
is PossibleAnswer .SingleChoice -> SingleChoiceQuestion (
104
102
possibleAnswer = question.answer,
@@ -164,28 +162,37 @@ private fun SingleChoiceQuestion(
164
162
Unit
165
163
}
166
164
val optionSelected = text == selectedOption
167
- Row (
168
- modifier = Modifier
169
- .fillMaxWidth()
170
- .selectable(
171
- selected = optionSelected,
172
- onClick = onClickHandle
173
- )
174
- .padding(vertical = 4 .dp),
175
- verticalAlignment = Alignment .CenterVertically
165
+ Surface (
166
+ shape = MaterialTheme .shapes.small,
167
+ border = BorderStroke (
168
+ width = 1 .dp,
169
+ color = MaterialTheme .colors.onSurface.copy(alpha = 0.12f )
170
+ ),
171
+ modifier = Modifier .padding(vertical = 8 .dp)
176
172
) {
177
- RadioButton (
178
- selected = optionSelected,
179
- onClick = onClickHandle,
180
- colors = RadioButtonConstants .defaultColors(
181
- selectedColor = MaterialTheme .colors.primary
173
+ Row (
174
+ modifier = Modifier
175
+ .fillMaxWidth()
176
+ .selectable(
177
+ selected = optionSelected,
178
+ onClick = onClickHandle
179
+ )
180
+ .padding(vertical = 16 .dp, horizontal = 24 .dp),
181
+ verticalAlignment = Alignment .CenterVertically ,
182
+ horizontalArrangement = Arrangement .SpaceBetween
183
+ ) {
184
+ Text (
185
+ text = text
182
186
)
183
- )
184
187
185
- Text (
186
- text = text,
187
- modifier = Modifier .padding(horizontal = 16 .dp)
188
- )
188
+ RadioButton (
189
+ selected = optionSelected,
190
+ onClick = onClickHandle,
191
+ colors = RadioButtonConstants .defaultColors(
192
+ selectedColor = MaterialTheme .colors.primary
193
+ )
194
+ )
195
+ }
189
196
}
190
197
}
191
198
}
@@ -205,31 +212,40 @@ private fun MultipleChoiceQuestion(
205
212
val selectedOption = answer?.answersStringRes?.contains(option.value)
206
213
mutableStateOf(selectedOption ? : false )
207
214
}
208
- Row (
209
- modifier = Modifier
210
- .fillMaxWidth()
211
- .padding(vertical = 4 .dp)
212
- .clickable(
213
- onClick = {
214
- checkedState = ! checkedState
215
- onAnswerSelected(option.value, checkedState)
216
- }
217
- )
215
+ Surface (
216
+ shape = MaterialTheme .shapes.small,
217
+ border = BorderStroke (
218
+ width = 1 .dp,
219
+ color = MaterialTheme .colors.onSurface.copy(alpha = 0.12f )
220
+ ),
221
+ modifier = Modifier .padding(vertical = 4 .dp)
218
222
) {
219
- Checkbox (
220
- checked = checkedState,
221
- onCheckedChange = { selected ->
222
- checkedState = selected
223
- onAnswerSelected(option.value, selected)
224
- },
225
- colors = CheckboxConstants .defaultColors(
226
- checkedColor = MaterialTheme .colors.primary
223
+ Row (
224
+ modifier = Modifier
225
+ .fillMaxWidth()
226
+ .clickable(
227
+ onClick = {
228
+ checkedState = ! checkedState
229
+ onAnswerSelected(option.value, checkedState)
230
+ }
231
+ )
232
+ .padding(vertical = 16 .dp, horizontal = 24 .dp),
233
+ verticalAlignment = Alignment .CenterVertically ,
234
+ horizontalArrangement = Arrangement .SpaceBetween
235
+ ) {
236
+ Text (text = option.key)
237
+
238
+ Checkbox (
239
+ checked = checkedState,
240
+ onCheckedChange = { selected ->
241
+ checkedState = selected
242
+ onAnswerSelected(option.value, selected)
243
+ },
244
+ colors = CheckboxConstants .defaultColors(
245
+ checkedColor = MaterialTheme .colors.primary
246
+ ),
227
247
)
228
- )
229
- Text (
230
- text = option.key,
231
- modifier = Modifier .padding(horizontal = 16 .dp)
232
- )
248
+ }
233
249
}
234
250
}
235
251
}
@@ -295,3 +311,24 @@ private fun SliderQuestion(
295
311
)
296
312
}
297
313
}
314
+
315
+ @Preview
316
+ @Composable
317
+ fun QuestionPreview () {
318
+ val question = Question (
319
+ id = 2 ,
320
+ questionText = R .string.pick_superhero,
321
+ answer = PossibleAnswer .SingleChoice (
322
+ optionsStringRes = listOf (
323
+ R .string.spiderman,
324
+ R .string.ironman,
325
+ R .string.unikitty,
326
+ R .string.captain_planet
327
+ )
328
+ ),
329
+ description = R .string.select_one
330
+ )
331
+ JetsurveyTheme {
332
+ Question (question = question, answer = null , onAnswer = {}, onAction = { _, _ -> })
333
+ }
334
+ }
0 commit comments