gpt4 book ai didi

android - (撰写 UI)- 键盘 (IME) 与应用程序的内容重叠

转载 作者:行者123 更新时间:2023-12-05 00:10:25 27 4
gpt4 key购买 nike

几天前,我遇到了一个问题,我的一部分 View 被键盘重叠。
假设我们有 3 个不同的对话框(可以是任何内容),如下所示:
enter image description here
当我想写任何东西时,最后一个对话框被键盘覆盖:
enter image description here
而且没有办法看到用户写了什么。这是我的代码:

@Composable
fun BuildWordsView(navController: NavController, sharedViewModel: SharedViewModel) {

Column(
modifier = Modifier
.fillMaxWidth()
.background(PrimaryLight)
.fillMaxSize()

) {
BuildWordsScreenContents()
}

}

@Composable
fun BuildWordsScreenContents() {

Column(
Modifier
.fillMaxSize()
.padding(all = 16.dp)

) {

val inputBoxModifier = Modifier
.clip(RoundedCornerShape(10.dp))
.background(Primary)
.weight(12f)
.wrapContentHeight()

InputBlock("Dialog1", inputBoxModifier)
Spacer(Modifier.weight(1f))
InputBlock("Dialog2", inputBoxModifier)
Spacer(Modifier.weight(1f))
InputBlock("Dialog3", inputBoxModifier)
}
}



@Composable
fun InputBlock(dialogText: String, inputBlockModifier: Modifier) {
Column(modifier = inputBlockModifier) {
Text(
dialogText,
fontSize = 30.sp,
textAlign = TextAlign.Center,
modifier = Modifier
.fillMaxWidth()
.wrapContentSize(Alignment.Center)
)
var text by remember { mutableStateOf("") }

TextField(
value = text,
modifier = Modifier
.fillMaxWidth()
.wrapContentSize(Alignment.Center),
onValueChange = { text = it },
label = { Text("Label") }
)
}
}
这个问题似乎与我的相似,但答案修改了我想避免的 View 内容:
Software keyboard overlaps content of jetpack compose view
到目前为止,我想出了如何解决这个问题,并分享我的方法作为答案

最佳答案

我处理这个问题的方法是使用 Jetpack Compose 的插页 :
https://google.github.io/accompanist/insets/
为了开始处理问题,您需要向 gradle 添加依赖(当前版本是 0.22.0-rc)。

dependencies { 
implementation "com.google.accompanist:accompanist-insets:0.22.0-rc"
}
然后您需要使用 ProvideWindowInsets 将您的内容包装在您的 Activity 中。
setContent {
ProvideWindowInsets {
YourTheme {
//YOUR CONTENT HERE
}
}
}
另外,您需要在 Activity onCreate() 函数中添加以下行: WindowCompat.setDecorFitsSystemWindows(window, false) 更新:尽管推荐使用此功能,但根据我的经验,它可能会使这种方法不起作用。如果您遇到任何问题,您可能需要删除此行。
现在您的项目设置为使用 插图
在接下来的步骤中,我将使用我提供的代码
首先,您需要用 ProvideWindowInsets(windowInsetsAnimationsEnabled = true)然后让我们通过添加来稍微修改一个修饰符:
.statusBarsPadding()
.navigationBarsWithImePadding()
.verticalScroll(rememberScrollState())
如您所见,我的方法中的技巧是使用verticalScroll()。主列的最终代码应如下所示:
@Composable
fun BuildWordsView(navController: NavController, sharedViewModel: SharedViewModel) {

ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {

Column(
modifier = Modifier
.fillMaxWidth()
.background(PrimaryLight)
.statusBarsPadding()
.navigationBarsWithImePadding()
.verticalScroll(rememberScrollState())
.fillMaxSize()

) {
BuildWordsScreenContents()
}
}
}
现在修改 fun BuildWordsScreenContents()中Column的修饰符
主要修改是我们通过以下方式提供屏幕高度:

.height(LocalConfiguration.current.screenHeightDp.dp)


这意味着我们 Column 的高度将完全适合我们的屏幕。 因此,当未打开键盘时,列将无法滚动
有完整的代码:
@Composable
fun BuildWordsView(navController: NavController, sharedViewModel: SharedViewModel) {

ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {

Column(
modifier = Modifier
.fillMaxWidth()
.background(PrimaryLight)
.statusBarsPadding()
.navigationBarsWithImePadding()
.verticalScroll(rememberScrollState())
.fillMaxSize()

) {
BuildWordsScreenContents()
}
}
}

@Composable
fun BuildWordsScreenContents() {

Column(
Modifier
.height(LocalConfiguration.current.screenHeightDp.dp)
.padding(all = 16.dp)

) {

val inputBoxModifier = Modifier
.clip(RoundedCornerShape(10.dp))
.background(Primary)
.weight(12f)
.wrapContentHeight()

InputBlock("Dialog1", inputBoxModifier)
Spacer(Modifier.weight(1f))
InputBlock("Dialog2", inputBoxModifier)
Spacer(Modifier.weight(1f))
InputBlock("Dialog3", inputBoxModifier)
}
}





@Composable
fun InputBlock(dialogText: String, inputBlockModifier: Modifier) {
Column(modifier = inputBlockModifier) {
Text(
dialogText,
fontSize = 30.sp,
textAlign = TextAlign.Center,
modifier = Modifier
.fillMaxWidth()
.wrapContentSize(Alignment.Center)
)
var text by remember { mutableStateOf("") }

TextField(
value = text,
modifier = Modifier
.fillMaxWidth()
.wrapContentSize(Alignment.Center),
onValueChange = { text = it },
label = { Text("Label") }
)
}
}
最后的代码允许我们向下 ScrollView :
enter image description here
API 的重要说明 30-
对于低于 30 的 API,您需要修改 AndroidManifest.xml 文件
android:windowSoftInputMode="adjustResize"为了使它工作。它 不要调整组件的大小,但必须使这种方法有效
list 应如下所示:
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustResize"
随时给我任何提示,我该如何改进我的问题。 AFAIK 这个问题与 android 一样古老,我想创建一个快速教程来管理它。快乐编码!

关于android - (撰写 UI)- 键盘 (IME) 与应用程序的内容重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70597345/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com