android 如何使windowSoftInputMode=“adjustPan”平移更多

ztigrdn8  于 2023-04-04  发布在  Android
关注(0)|答案(6)|浏览(158)

我有一个activity,上面有一堆EditText字段,windowSoftInputMode被设置为adjustPan,这基本上是我想要的,但是对于布局底部的editText,它的平移不够。它会平移显示多行编辑文本的第一行,但是只要你按下enter,光标就会向下移动一行,现在隐藏在键盘下面。
有没有办法让它平移得更远,这样editText的顶部就一直在窗口的顶部。
使用adjustResize肯定不会做我想要的,平移是正确的事情,只是需要它进一步平移。

jdg4fx2g

jdg4fx2g1#

同样的事情也发生在我身上。
我所做的解决方法是,我只是把所有的控件放在ScrollView中。
并设置android:windowSoftInputModeadjustResize。因此,每当键盘打开时,它将滚动屏幕以调整视图,并且Edittext始终显示在屏幕上。
希望这个想法对你有用。
谢谢

wvyml7n5

wvyml7n52#

这是一个非常古老的帖子,但我最近在我的项目中也遇到了这个问题。我想出了一个完美解决这个问题的解决方案,所以我想分享一下,以帮助人们避免我所经历的挣扎。
将windowSoftInputMode设置为“Adjust Resize”不起作用,因为我的应用程序是全屏的。(这是由于一个android bug提到的here).即使它确实工作了,我相信这个选项不是很好的UI.所以我也想让“调整平移”选项与“更多平移”一起工作,而且不幸的是Android并没有提供调整这个边距的API,而且在editText中添加“paddingBottom”会让屏幕的UI不平衡。
经过大量的研究,我能够通过以下步骤解决这个问题;(我用this非常有用的中等职位)
1 -从AndroidManifest生成windowSoftInputMode=“adjustUnspecified”。
2 -添加以下方法作为扩展函数;

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 -创建全局布局监听器,用于检测键盘何时可见,如下所示;

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方法中,我将我的主Activity布局向上滚动screenHeight/4,这通常足够了,但是你可以随意调整滚动量,并将布局更改为你想要滚动的布局。此外,我使用过渡动画来使过渡更平滑,这对于功能来说不是必需的。

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上删除监听器,如下所示;

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设置为“adjustNothing”,则无法执行此操作。因为侦听器逻辑将失败。
  • 此外,如果你使用“adjustPan”,它将无法按预期工作,因为此逻辑从当前滚动点调整平移。因此,假设您在同一视图中有两个编辑文本,用户单击第一个,它从Android逻辑向上平移布局一点,然后从我们在这里实现的逻辑滚动。然后用户单击第二个视图,Android逻辑从当前的scroll y值开始平移,所以它再次非常接近editText,我们的逻辑不起作用,因为scroll y已经增加了。或者,您可以继续增加scroll y,这将导致布局中的不成比例,并且不需要。
zzzyeukh

zzzyeukh3#

将您的EditText放入ScrollView中,然后给予属性adjustResize,而不是adjustPan,它会自动调整您的屏幕及其组件。

zqry0prt

zqry0prt4#

我在屏幕底部有edittext,当我触摸它打开软键盘,但它隐藏了edittext,所以在布局中进行更改(使用相对布局),它为我工作,而不使用adjustPan

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gen_mainlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg"
    android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <RelativeLayout
            android:id="@+id/headerlinearLayout"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/navigation_bar" >

            <Button
                android:id="@+id/chatterBack"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:layout_marginLeft="20dp"
                android:background="@drawable/navigation_cancel_button"
                android:textColor="#FFFFFF" >
            </Button>

            <TextView
                android:id="@+id/ittletextView"
                style="@style/titleText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:text="Title" >
            </TextView>

            <Button
                android:id="@+id/blockhide"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="20dp"
                android:background="@drawable/navigation_cancel_button"
                android:padding="5dp"
                android:text="Block/Hide"
                android:textColor="#FFFFFF" >
            </Button>
        </RelativeLayout>

        <LinearLayout
            android:id="@+id/middlelinearLayout"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/headerlinearLayout"
            android:orientation="vertical" >

        </LinearLayout>

        <LinearLayout
            android:id="@+id/footerlinearLayout"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@drawable/commnet_post_bg"
            android:gravity="center"
            android:paddingLeft="5dp"
            android:paddingRight="5dp" >

            <EditText
                android:id="@+id/sendeditText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="5dp"
                android:layout_weight="1"
                android:background="@drawable/comment_post_text_box"
                android:imeOptions="actionSend|flagNoEnterAction"
                android:inputType="text"
                android:paddingLeft="10dp"
                android:paddingRight="5dp"
                android:singleLine="true" >
            </EditText>

            <Button
                android:id="@+id/sendButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/send_button"
                android:text="Send"
                android:textColor="#FFFFFF" >
            </Button>
        </LinearLayout>
    </RelativeLayout>

</LinearLayout>
hmmo2u0o

hmmo2u0o5#

对于那些实际上想要更多地向上平移页面的人。你可以在你的rootView上做你自己的向上/向下平移逻辑。你需要自己计算要平移多少距离。
参见此示例https://github.com/yatw/SoftKeyboardAdjust

roejwanj

roejwanj6#

您需要将这一行添加到您的Activity中以调整屏幕。

<activity android:name=".TodoEdit"
        android:windowSoftInputMode="adjustResize">

相关问题