feat(ui): 优化界面在小屏幕下的显示效果
为对话框内容添加滚动以防遮挡 为顶部应用栏文本设置单行 优化单选对话框的实现方式
This commit is contained in:
parent
746b663e9c
commit
b5f327cacc
4 changed files with 57 additions and 30 deletions
|
|
@ -1,5 +1,8 @@
|
||||||
package cn.super12138.todo.ui.components
|
package cn.super12138.todo.ui.components
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.outlined.ErrorOutline
|
import androidx.compose.material.icons.outlined.ErrorOutline
|
||||||
import androidx.compose.material3.AlertDialog
|
import androidx.compose.material3.AlertDialog
|
||||||
|
|
@ -103,7 +106,11 @@ fun BasicDialog(
|
||||||
AlertDialog(
|
AlertDialog(
|
||||||
icon = icon,
|
icon = icon,
|
||||||
title = title,
|
title = title,
|
||||||
text = text,
|
text = {
|
||||||
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||||
|
text?.let { it() }
|
||||||
|
}
|
||||||
|
},
|
||||||
confirmButton = confirmButton,
|
confirmButton = confirmButton,
|
||||||
dismissButton = dismissButton,
|
dismissButton = dismissButton,
|
||||||
onDismissRequest = onDismissRequest,
|
onDismissRequest = onDismissRequest,
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,7 @@ fun MainPage(
|
||||||
enter = fadeIn() + expandIn(),
|
enter = fadeIn() + expandIn(),
|
||||||
exit = shrinkOut() + fadeOut()
|
exit = shrinkOut() + fadeOut()
|
||||||
) {
|
) {
|
||||||
|
// TODO: 修复在滑动列表时FAB位移导致的动画不连贯
|
||||||
TodoFAB(
|
TodoFAB(
|
||||||
expanded = isExpanded,
|
expanded = isExpanded,
|
||||||
onClick = {
|
onClick = {
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalView
|
import androidx.compose.ui.platform.LocalView
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import cn.super12138.todo.R
|
import cn.super12138.todo.R
|
||||||
import cn.super12138.todo.utils.VibrationUtils
|
import cn.super12138.todo.utils.VibrationUtils
|
||||||
|
|
@ -74,7 +75,9 @@ fun TodoTopAppBar(
|
||||||
R.string.title_selected_count,
|
R.string.title_selected_count,
|
||||||
selectedTodoIds.size
|
selectedTodoIds.size
|
||||||
)
|
)
|
||||||
}
|
},
|
||||||
|
maxLines = 1,
|
||||||
|
overflow = TextOverflow.Ellipsis
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
actions = {
|
actions = {
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,6 @@ fun SettingsRadioDialog(
|
||||||
onDismiss: () -> Unit,
|
onDismiss: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
val view = LocalView.current
|
|
||||||
SettingsDialog(
|
SettingsDialog(
|
||||||
visible = visible,
|
visible = visible,
|
||||||
title = title,
|
title = title,
|
||||||
|
|
@ -42,33 +41,15 @@ fun SettingsRadioDialog(
|
||||||
// Modifier.selectableGroup() 用来确保无障碍功能运行正确
|
// Modifier.selectableGroup() 用来确保无障碍功能运行正确
|
||||||
Column(Modifier.selectableGroup()) {
|
Column(Modifier.selectableGroup()) {
|
||||||
options.forEach { option ->
|
options.forEach { option ->
|
||||||
Row(
|
RadioItem(
|
||||||
Modifier
|
selected = option.id == selectedItemIndex,
|
||||||
.fillMaxWidth()
|
text = option.text,
|
||||||
.height(56.dp)
|
onClick = {
|
||||||
.selectable(
|
selectedItemIndex = option.id
|
||||||
selected = option.id == selectedItemIndex,
|
onSelect(option.id)
|
||||||
onClick = {
|
onDismiss()
|
||||||
selectedItemIndex = option.id
|
}
|
||||||
VibrationUtils.performHapticFeedback(view)
|
)
|
||||||
onSelect(option.id)
|
|
||||||
onDismiss()
|
|
||||||
},
|
|
||||||
role = Role.RadioButton
|
|
||||||
)
|
|
||||||
.padding(horizontal = 16.dp),
|
|
||||||
verticalAlignment = Alignment.CenterVertically
|
|
||||||
) {
|
|
||||||
RadioButton(
|
|
||||||
selected = option.id == selectedItemIndex,
|
|
||||||
onClick = null // 设置为 null 有利于屏幕阅读器
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = option.text,
|
|
||||||
style = MaterialTheme.typography.bodyLarge,
|
|
||||||
modifier = Modifier.padding(start = 16.dp)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -77,6 +58,41 @@ fun SettingsRadioDialog(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun RadioItem(
|
||||||
|
selected: Boolean,
|
||||||
|
text: String,
|
||||||
|
onClick: () -> Unit,
|
||||||
|
modifier: Modifier = Modifier
|
||||||
|
) {
|
||||||
|
val view = LocalView.current
|
||||||
|
Row(
|
||||||
|
Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.height(56.dp)
|
||||||
|
.selectable(
|
||||||
|
selected = selected,
|
||||||
|
onClick = {
|
||||||
|
VibrationUtils.performHapticFeedback(view)
|
||||||
|
onClick()
|
||||||
|
},
|
||||||
|
role = Role.RadioButton
|
||||||
|
),
|
||||||
|
// .padding(horizontal = TodoDefaults.screenPadding),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
RadioButton(
|
||||||
|
selected = selected,
|
||||||
|
onClick = null // 设置为 null 有利于屏幕阅读器
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = text,
|
||||||
|
style = MaterialTheme.typography.bodyLarge,
|
||||||
|
modifier = Modifier.padding(start = 16.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
data class SettingsRadioOptions(
|
data class SettingsRadioOptions(
|
||||||
val id: Int,
|
val id: Int,
|
||||||
val text: String,
|
val text: String,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue