首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让windowSoftInputMode="adjustPan“平移更多

如何让windowSoftInputMode="adjustPan“平移更多
EN

Stack Overflow用户
提问于 2012-01-25 12:18:51
回答 6查看 4K关注 0票数 16

我有一个活动,上面有一堆EditText字段,windowSoftInputMode被设置为adjustPan,这主要是我想要的,但是对于布局底部的editText,它不够平移。它会平移以显示多行编辑文本的顶行,但只要您一按enter,光标就会向下移动一行,并且现在隐藏在键盘下面。

不管怎么说,我可以让它平移得更远,这样editText的顶部就一直在窗口的顶部。

使用adjustResize肯定不会做我想要的事情,平移是正确的,只是需要它来进一步平移。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-10-29 18:53:56

同样的事情也发生在我身上。

我要解决的问题是,我只是将所有控件都放在ScrolllView中。

并设置安卓:windowSoftInputMode adjustResize。因此,每当键盘打开时,它会滚动屏幕以调整视图,并且编辑文本始终显示在屏幕上。

希望这个想法对你有用。

谢谢

票数 6
EN

Stack Overflow用户

发布于 2014-10-31 19:47:30

把你的EditText放在ScrollView里面,然后给属性adjustResize,而不是adjustPan,它会自动调整你的屏幕和它的组件。

票数 1
EN

Stack Overflow用户

发布于 2020-12-17 17:52:29

这是一个非常古老的帖子,但我最近在我的项目中也在为此而苦苦挣扎。我已经想出了一个完美地解决这个问题的解决方案,所以我想分享一下,以帮助某人避免我所经历的挣扎。

将windowSoftInputMode设置为“调整大小”不起作用,因为我的应用程序是全屏的。(这是由于here中提到的一个安卓bug )。即使它确实起作用了,我相信这个选项也不是很好的UI。所以我也想让“调整平移”选项与“更多平移”一起工作,不幸的是Android没有提供一个API来调整这个边距。向editText添加"paddingBottom“会使屏幕的UI不平衡。

经过大量的研究,我能够通过遵循这些步骤来解决这个问题;(我使用了this非常有用的媒体帖子)

1-从AndroidManifest生成windowSoftInputMode="adjustUnspecified“。

2-添加以下方法作为扩展函数;

代码语言:javascript
复制
fun Activity.getRootView(): View {
    return findViewById<View>(android.R.id.content)
}
fun Context.convertDpToPx(dp: Float): Float {
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        dp,
        this.resources.displayMetrics
    )
}
fun Activity.isKeyboardOpen(): Boolean {
    val visibleBounds = Rect()
    this.getRootView().getWindowVisibleDisplayFrame(visibleBounds)
    val heightDiff = getRootView().height - visibleBounds.height()
    val marginOfError = Math.round(this.convertDpToPx(50F))
    return heightDiff > marginOfError
}

3-创建一个全局布局监听器,用于检测键盘何时可见,如下所示;

代码语言:javascript
复制
  val listener = object : ViewTreeObserver.OnGlobalLayoutListener {
        // Keep a reference to the last state of the keyboard
        private var lastState: Boolean = isKeyboardOpen() ?: false
        /**
         * Something in the layout has changed
         * so check if the keyboard is open or closed
         * and if the keyboard state has changed
         * save the new state and invoke the callback
         */
        override fun onGlobalLayout() {
            val isOpen = isKeyboardOpen() ?: false
            if (isOpen == lastState) {
                return
            } else {
                onKeyboardStateChanged(isOpen)
                lastState = isOpen
            }
        }
    }

4-在onKeyboardStateChanged方法中,我将我的主要活动布局向上滚动screenHeight/4,这通常就足够了,但您可以根据需要调整滚动量,并将布局更改为您想滚动的任何布局。此外,我使用过渡动画来使过渡更平滑,这对于功能来说不是必需的。

代码语言:javascript
复制
private fun onKeyboardStateChanged(open: Boolean) {
    runOnUiThread {
        if (open) {
            val screenHeight = resources.displayMetrics.heightPixels
            TransitionManager.beginDelayedTransition(main_activity_layout as ViewGroup)
            main_activity_layout.scrollTo(0, screenHeight / 4)
        } else {
            TransitionManager.beginDelayedTransition(main_activity_layout as ViewGroup)
            main_activity_layout.scrollTo(0, 0)
        }
    }
}

5-在您的onResume上添加要侦听的视图,并删除onPause上的侦听器,如下所示;

代码语言:javascript
复制
 override fun onResume() {
        super.onResume()
        val view = getRootView()
        view.viewTreeObserver?.addOnGlobalLayoutListener(listener)
    }

    override fun onPause() {
        super.onPause()
        val view = getRootView()
        view.viewTreeObserver?.removeOnGlobalLayoutListener(listener)
    }

如果您将windowSoftInputMode设置为“

  • ”,这将不起作用。因为侦听器逻辑将失败。

  • 此外,如果您将其与"adjustPan“一起使用,它将不会像预期的那样工作,因为此逻辑将从当前滚动点调整平移。假设您在同一视图中有两个编辑文本,用户单击第一个文本,它会将布局从Android逻辑向上平移一点,然后从我们在此处实现的逻辑滚动。然后用户点击第二个视图,Android逻辑从当前的滚动y值平移,所以它再次非常接近editText,我们的逻辑不起作用,因为滚动y已经增加了。或者,您可以继续增加滚动y,这将导致您的布局变得不成比例,这并不是您所希望的。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8997756

复制
相关文章

相似问题

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