Я столкнулся с проблемой с поведением макета на экране чата с помощью Jetpack Compose. У меня есть Scaffold, содержащий TopAppBar, BottomBar с TextField и LazyColumn между ними для содержимого чата. Когда клавиатура появляется после нажатия на TextField в BottomBar, весь экран, включая TopAppBar, смещается вверх. Я стремлюсь к поведению, аналогичному приложениям для обмена сообщениями, таким как WhatsApp, где TopAppBar остается фиксированным, а с помощью клавиатуры перемещаются только BottomBar и LazyColumn (содержимое чата).
Вот фрагмент мой текущий код:
Scaffold(
topBar = {
},
bottomBar = {
// CustomNavBar (BottomBar) implementation containing a TextField for typing messages
}
) { paddingValues ->
// Box containing the content of the chat screen (LazyColumn)
Box(
modifier = Modifier.padding(
top = paddingValues.calculateTopPadding(),
bottom = paddingValues.calculateBottomPadding()
)
) {
// Chat content (OneToOneChatScreen or GroupChatScreen) displayed within LazyColumn
}
}
У меня также есть проблема с нижней панелью: между DropDownItems и строкой, которая имеет TextField, остается разрыв, когда мое DropDownMenu развернуто.
Мой customBottomBar
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun CustomNavBar(
allSendersContactMethods: List
) {
var messageText by remember { mutableStateOf("") }
val showSendButton: Boolean by remember { derivedStateOf { messageText.isNotEmpty() } }
var sendersContactMethodNumber: Int by remember { mutableIntStateOf(1) }
var expanded: Boolean by remember { mutableStateOf(false) }
var selectedSendersContactMethod by remember { mutableStateOf(allSendersContactMethods.first()) }
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.End
) {
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
modifier = Modifier.fillMaxWidth()
) {
allSendersContactMethods.forEachIndexed { index, method ->
DropdownMenuItem(
onClick = {
sendersContactMethodNumber = index + 1
selectedSendersContactMethod = method
expanded = false
},
text = {
Text(text = method)
},
)
}
}
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 4.dp),
verticalAlignment = Alignment.CenterVertically
) {
TextField(
value = messageText,
onValueChange = { messageText = it },
modifier = Modifier
.weight(1f)
.background(
shape = CircleShape,
color = MaterialTheme.colorScheme.inverseOnSurface
)
.padding(horizontal = 8.dp),
placeholder = { Text(text = "Type a message") },
maxLines = 4,
colors = TextFieldDefaults.textFieldColors(
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent,
containerColor = Color.Transparent
),
trailingIcon = {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "$sendersContactMethodNumber",
fontSize = 14.sp,
color = MaterialTheme.colorScheme.primary,
modifier = Modifier
.clickable { expanded = true }
.border(
1.5.dp, MaterialTheme.colorScheme.primary,
RoundedCornerShape(4.dp)
)
.padding(vertical = 1.dp, horizontal = 4.dp)
)
if (showSendButton) {
Spacer(modifier = Modifier.width(4.dp))
IconButton(onClick = { /* Handle send action */ }) {
Icon(
Icons.Outlined.Send,
contentDescription = "Send",
tint = MaterialTheme.colorScheme.primary
)
}
}
}
}
)
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/777 ... oard-is-di
Как сохранить верхнюю панель неподвижной в Jetpack Compose, когда отображается клавиатура? ⇐ Android
Форум для тех, кто программирует под Android
1717188803
Anonymous
Я столкнулся с проблемой с поведением макета на экране чата с помощью Jetpack Compose. У меня есть Scaffold, содержащий TopAppBar, BottomBar с TextField и LazyColumn между ними для содержимого чата. Когда клавиатура появляется после нажатия на TextField в BottomBar, весь экран, включая TopAppBar, смещается вверх. Я стремлюсь к поведению, аналогичному приложениям для обмена сообщениями, таким как WhatsApp, где TopAppBar остается фиксированным, а с помощью клавиатуры перемещаются только BottomBar и LazyColumn (содержимое чата).
Вот фрагмент мой текущий код:
Scaffold(
topBar = {
},
bottomBar = {
// CustomNavBar (BottomBar) implementation containing a TextField for typing messages
}
) { paddingValues ->
// Box containing the content of the chat screen (LazyColumn)
Box(
modifier = Modifier.padding(
top = paddingValues.calculateTopPadding(),
bottom = paddingValues.calculateBottomPadding()
)
) {
// Chat content (OneToOneChatScreen or GroupChatScreen) displayed within LazyColumn
}
}
У меня также есть проблема с нижней панелью: между DropDownItems и строкой, которая имеет TextField, остается разрыв, когда мое DropDownMenu развернуто.
Мой customBottomBar
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun CustomNavBar(
allSendersContactMethods: List
) {
var messageText by remember { mutableStateOf("") }
val showSendButton: Boolean by remember { derivedStateOf { messageText.isNotEmpty() } }
var sendersContactMethodNumber: Int by remember { mutableIntStateOf(1) }
var expanded: Boolean by remember { mutableStateOf(false) }
var selectedSendersContactMethod by remember { mutableStateOf(allSendersContactMethods.first()) }
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.End
) {
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
modifier = Modifier.fillMaxWidth()
) {
allSendersContactMethods.forEachIndexed { index, method ->
DropdownMenuItem(
onClick = {
sendersContactMethodNumber = index + 1
selectedSendersContactMethod = method
expanded = false
},
text = {
Text(text = method)
},
)
}
}
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 4.dp),
verticalAlignment = Alignment.CenterVertically
) {
TextField(
value = messageText,
onValueChange = { messageText = it },
modifier = Modifier
.weight(1f)
.background(
shape = CircleShape,
color = MaterialTheme.colorScheme.inverseOnSurface
)
.padding(horizontal = 8.dp),
placeholder = { Text(text = "Type a message") },
maxLines = 4,
colors = TextFieldDefaults.textFieldColors(
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent,
containerColor = Color.Transparent
),
trailingIcon = {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "$sendersContactMethodNumber",
fontSize = 14.sp,
color = MaterialTheme.colorScheme.primary,
modifier = Modifier
.clickable { expanded = true }
.border(
1.5.dp, MaterialTheme.colorScheme.primary,
RoundedCornerShape(4.dp)
)
.padding(vertical = 1.dp, horizontal = 4.dp)
)
if (showSendButton) {
Spacer(modifier = Modifier.width(4.dp))
IconButton(onClick = { /* Handle send action */ }) {
Icon(
Icons.Outlined.Send,
contentDescription = "Send",
tint = MaterialTheme.colorScheme.primary
)
}
}
}
}
)
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/77707291/how-can-i-keep-the-top-bar-stationary-in-jetpack-compose-when-the-keyboard-is-di[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия