feat(ui): 优化界面在小屏幕下的显示效果

为对话框内容添加滚动以防遮挡
为顶部应用栏文本设置单行
优化单选对话框的实现方式
This commit is contained in:
Super12138 2025-02-07 08:52:17 +08:00
parent 746b663e9c
commit b5f327cacc
4 changed files with 57 additions and 30 deletions

View file

@ -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,

View file

@ -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 = {

View file

@ -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 = {

View file

@ -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,