本文介绍了LazyColumn中的Textfield输入法填充,撰写的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题:文本字段(在惰性列中)文本位于键盘键下方

解释:

我有一个LazyColumn,它包含显示文本字段的项的列表,在清单中,活动有windowSoftInputMode="adjustResize",我还在setContent之前在onCreate方法中设置了WindowCompat.setDecorFitsSystemWindows(window,false),我想让文本始终显示在键盘上方,以获得更流畅的编辑体验!

使用提供窗口插图的伴奏者库对Box进行填充

Box(modifier = Modifier.weight(1f).navigationBarsWithImePadding()){
    LazyColumn() {
         items(myItems) { item->
              ItemComposable(item)
         }
    }
}

如您所见,框上有NavigationBarsWithImePadding,但它不起作用,因为文本位于键盘下方,我尝试在LazyColumn上设置修饰符,但它提供了相对于框外其他项的LazyColumn填充!

所以我尝试contentPadding

LazyColumn(contentPadding=insets.ime.toPaddingValues(additionalBottom=insets.navigationBars.bottom.dp)) {
    items(editor.blocks) { block ->
        RenderBlock(block)
    }
}

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

将LazyColumn替换为简单列并使用verticalScroll修饰符会导致相同的问题,因为列表可以是长的垂直滚动成为一种需要

可能的解决方案

val bringIntoViewRequester = remember { BringIntoViewRequester() }

TextField(
  modifier = Modifier
        .fillMaxWidth()
        .bringIntoViewRequester(bringIntoViewRequester),
  value = name,
  onValueChange = {
     name = it
     scope.launch {
        relocationRequestor.bringIntoView()
     }
  }
)

推荐答案

终于有了一个solution。只需执行以下步骤:

第一步:在您的androidManifest.xml中

 <activity
    ...
    android:windowSoftInputMode="adjustResize">
 </activity>

第二步:在您的活动中

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    WindowCompat.setDecorFitsSystemWindows(window, false)

    setContent {

        AppTheme {

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

第三步:

LazyColumn(
  modifier = Modifier
    .navigationBarsWithImePadding()
    .verticalScroll(state = rememberScrollState())
    .height(LocalConfiguration.current.screenHeightDp.dp)
    .fillMaxWidth(),
 ) {
      // your TextField items
   }

第四步:

 // 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()
            }
        }
    }
}

希望它能有所帮助。

这篇关于LazyColumn中的Textfield输入法填充,撰写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-12 16:04