34

我有一个活动,中间有一个 editText。当我点击editText时,键盘出现,屏幕移动,editText就在键盘上方,覆盖了下面的其他东西。

我不想在布局中调整大小或添加填充。我需要屏幕滚动到顶部,我需要看到下面的其他内容。换句话说,我想在键盘出现时选择editText的位置。如果屏幕完全向上滚动,向我显示布局的底部就足够了。

我试图将布局放在滚动视图中,在 editText 上添加此代码

    editText.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //make the view scroll down to the bottom
            scrollView.scrollTo(0, scrollView.getBottom());

        }
    });

但它不起作用。有人有想法吗?先感谢您!

4

10 回答 10

45

使用 android:windowSoftInputMode="adjustPan"

“调整大小”

Activity 的主窗口总是调整大小,以便为屏幕上的软键盘腾出空间。

“调整盘”

Activity 的主窗口没有调整大小来为软键盘腾出空间。相反,窗口的内容会自动平移,因此当前焦点永远不会被键盘遮挡,用户始终可以看到他们正在输入的内容。这通常不如调整大小可取,因为用户可能需要关闭软键盘才能到达窗口的模糊部分并与之交互。

例如,您的清单文件:-

       <activity
    android:windowSoftInputMode="adjustPan"
    android:name=".MainActivity"></activity>

迟到的答案。但它肯定对任何人都有帮助。

于 2015-12-08T02:58:31.843 回答
26

我曾经遇到过类似的问题,我使用以下方法解决了:

    android:windowSoftInputMode="adjustResize"

在 AndroidManifest.xml 中。

如果使用RelativeLayout从必须挂钩到父底部的底部元素开始,然后将其他元素挂钩到前一个元素之上。

如果您使用LinearLayout将其包装在RelativeLayout中并将LinearLayout挂钩到 parentBottom。

这样,当键盘弹出时,您将看到布局的底部。

希望这可以帮助。

于 2013-10-24T03:19:34.117 回答
10

我遇到了这个问题,我用这段代码解决了:

myEdittext.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    myscrollview.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            View lastChild = myscrollview.getChildAt(myscrollview.getChildCount() - 1);
                            int bottom = lastChild.getBottom() + myscrollview.getPaddingBottom();
                            int sy = myscrollview.getScrollY();
                            int sh = myscrollview.getHeight();
                            int delta = bottom - (sy + sh);
                            myscrollview.smoothScrollBy(0, delta);
                        }
                    }, 200);
                }
            });
于 2017-08-08T08:26:32.463 回答
5

这对我有用

android:windowSoftInputMode="stateVisible|adjustResize"

在活动的 androidmanifest 中

于 2014-03-30T16:33:28.720 回答
5

这有效: -

当 Keyboard 在Constraint Layout中打开时,向上滚动存在问题。不要用那个。

实现“出现键盘时向上滚动屏幕”试试这个

使用线性布局滚动视图

和滚动视图中的fill_parent。以及滚动视图中的任何文本字段。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   android:gravity="center">

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true">


</ScrollView>
</LinearLayout>
于 2019-02-06T12:01:49.200 回答
4

将此添加到您的 gradle 依赖项中:

dependencies {
    compile 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.1.0'
}

并使用此代码:

KeyboardVisibilityEvent.setEventListener(getActivity(), new KeyboardVisibilityEventListener() {
    @Override
    public void onVisibilityChanged(boolean isOpen) {

        if (isOpen && MY_EDIT_TEXT.hasFocus()) {

            //scroll to last view
            View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1);
            int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom();
            int sy = scrollLayout.getScrollY();
            int sh = scrollLayout.getHeight();
            int delta = bottom - (sy + sh);

            scrollLayout.smoothScrollBy(0, delta);
        }
    }
});
于 2018-09-28T15:51:45.220 回答
1

它仅在我从约束布局更改为线性布局并添加后才对我有用

android:windowSoftInputMode="adjustResize".

并删除

<item name="android:windowFullscreen">true</item>从活动风格

于 2019-04-16T23:23:15.223 回答
1

只需添加

android:screenReaderFocusable="true"

到您的 XML 文件,它会像一个魅力

于 2020-07-04T18:18:26.010 回答
0

在 Kotlin 中执行此操作的简单方法(从用户user6581344的答案中重复使用),我使用它在设置焦点并显示键盘时手动滚动到 EditText,因为需要在键盘和 EditText 之间添加额外的底部填充:

    binding.scrollView.postDelayed(object:Runnable {

        override fun run() {

            val extraBottomPadding = 100

            val manualScroll = txtFullName.y + extraBottomPadding

            scrollView.smoothScrollBy(0, manualScroll.toInt())
        }

    }, 200)
于 2021-03-03T15:27:32.917 回答
0

此代码对我有用,无需在您的活动覆盖 onUserInteraction() 函数中添加 clickListener() 或 focusChanhgeListener()

@Override
public void onUserInteraction() {
    super.onUserInteraction();
    if (editText.hasFocus() ) { // to check if user is clicked on edit text 
        if (scroll.getVerticalScrollbarPosition() != scroll.getBottom())  // if scrollview is not already on the bottom 
            scroll.post(() -> scroll.scrollTo(0, scroll.getBottom()));
    }
}
于 2021-09-26T08:32:06.040 回答