首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TextField IME填充在LazyColumn中,组成

TextField IME填充在LazyColumn中,组成
EN

Stack Overflow用户
提问于 2021-04-17 14:02:26
回答 2查看 4.6K关注 0票数 18

问题: TextField (在惰性列中)文本位于keybaord下面

解释:

我有一个LazyColumn,其中包含一个显示文本字段的项目列表,在清单中,该活动具有windowSoftInputMode="adjustResize",而且在setContent之前,我还在onCreate方法中设置标志WindowCompat.setDecorFitsSystemWindows(window,false),并且我希望在任何时候都使文本出现在键盘上方,以获得更流畅的编辑体验!

使用伴奏库提供窗口插口,向盒子提供如下填充

代码语言:javascript
复制
Box(modifier = Modifier.weight(1f).navigationBarsWithImePadding()){
    LazyColumn() {
         items(myItems) { item->
              ItemComposable(item)
         }
    }
}

正如您所看到的,盒子上有navigationBarsWithImePadding,但是它不能工作,因为文本位于键盘下面,我尝试在LazyColumn上设置修饰符,但是它提供了相对于框外其他项的LazyColumn填充!

所以我尝试了contentPadding

代码语言:javascript
复制
LazyColumn(contentPadding=insets.ime.toPaddingValues(additionalBottom=insets.navigationBars.bottom.dp)) {
    items(editor.blocks) { block ->
        RenderBlock(block)
    }
}

同样没有工作,因为内容填充应用于最后一项/或之后,键盘位于文本上方。

用一个简单的列替换LazyColumn并使用一个LazyColumn修饰符会导致同样的问题,因为列表可以是长的垂直滚动。

EN

回答 2

Stack Overflow用户

发布于 2021-12-11 05:33:58

如果使用列,则可以参考以下代码片段:

代码语言:javascript
复制
Column(
    modifier = Modifier
        // other modifiers
        .verticalScroll(scrollState, reverseScrolling = true)
        .navigationBarsWithImePadding(),
    verticalArrangement = Arrangement.Bottom,
)
票数 1
EN

Stack Overflow用户

发布于 2021-12-17 09:57:58

最后,我为它准备了一个解决方案。只需遵循以下步骤:

步骤1:在您的AndroidManifest.xml中

代码语言:javascript
复制
 <activity
    ...
    android:windowSoftInputMode="adjustResize">
 </activity>

步骤2:在你的活动中

代码语言:javascript
复制
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    WindowCompat.setDecorFitsSystemWindows(window, false)

    setContent {

        AppTheme {

           ProvideWindowInsets(
               windowInsetsAnimationsEnabled = true,
               consumeWindowInsets = false,
           ) {
              // your content
             }
         }
     }

第3步:

代码语言:javascript
复制
LazyColumn(
  modifier = Modifier
    .navigationBarsWithImePadding()
    .verticalScroll(state = rememberScrollState())
    .height(LocalConfiguration.current.screenHeightDp.dp)
    .fillMaxWidth(),
 ) {
      // your TextField items
   }

第4步:

代码语言:javascript
复制
 // init your CoroutineScope
 val  coroutineScope = rememberCoroutineScope()

 // init your BringIntoViewRequester
 val  bringIntoViewRequester = BringIntoViewRequester()

 // use them in your TextField modifier
 modifier = Modifier
   /* ... your other modifiers*/
    .bringIntoViewRequester(bringIntoViewRequester)
    .onFocusEvent {
        if (it.isFocused || it.hasFocus) {
            coroutineScope.launch {
                delay(250)
                bringIntoViewRequester.bringIntoView()
            }
        }
    }
}

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67138999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档