Android:键盘弹出时ScrollView无法滚动

58

我有一个布局,其中包含一些视图,其中一个是EditText。布局轻松适合一页,但是,当软键盘弹出时,布局不会滚动。 以下是我的布局概述:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background" >

    <ScrollView
        android:id="@+id/ScrollView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <CheckBox/>

            <TextView/>

            <LinearLayout>
                <EditText>
                    <requestFocus />
                </EditText>
            </LinearLayout>

            <TextView/>

            <LinearLayout>
                <Spinner/>
            </LinearLayout>

        </LinearLayout>

    </ScrollView>

    <Button
        android:layout_alignParentBottom="true" />

</RelativeLayout>

而在我的清单文件中,我声明了该属性:

android:windowSoftInputMode="adjustResize|stateHidden"

有人知道为什么它不起作用,以及如何确保它可以起作用吗?


2
如果你在使用Android5,可以参考这篇相关文章:Android - adjust scrollview when keyboard is up for android 5.0 (lollipop) - Richard Le Mesurier
12个回答

68

我遇到了同样的问题,我在清单文件中检查了我的活动,并且原因是我没有使用这个属性:

android:windowSoftInputMode="adjustResize"

现在它运作良好,不需要做额外的锚点。


38

好的,显然ScrollView的android:layout_height属性不能设置为wrap_content。我将其设置为match_parent并将android:layout_above设置为页面底部的按钮。

不要问我为什么,但这样修复了问题。


6
layout_above指定一个视图位于屏幕底部固定时,其他视图相对其上方的布局方式。 - Xander
3
如果底部没有固定视图,该怎么办? - Nguyen Minh Binh
1
如果ScrollView只占屏幕的一部分,则无法正常工作。如果您在活动底部有一个充当页脚的布局,则此解决方案将无法正常工作。 - Johann

27
在我的情况下,以上所有方法都没有起作用。在我的主题中有一个 item name="android:windowTranslucentStatus">true</item> 属性。通过在包含我的滚动视图的父布局中设置 android:fitsSystemWindows="true" 来解决此问题。

13
android:windowSoftInputMode="stateHidden|adjustResize" 添加到 AndroidManifest.xml 文件中的<activity>标签中。这将导致在软键盘显示后屏幕被调整为剩余空间大小,因此您可以轻松滚动屏幕。

6
如果您的第一个片段可以完美滚动而第二个片段无法滚动,则应该使用第二个片段的替换并执行以下操作:
1. 添加ScrollView
android:fillViewport="true"
android:fitsSystemWindows="true"

2. 在清单文件中添加

android:windowSoftInputMode="adjustResize|stateVisible"

如果您添加了片段,那么我的建议是您需要替换该片段。


5
在我的情况下,上述的任何解决方案都不起作用,直到我删除在我的活动中使用 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 这段代码来获得全屏显示。也许对于某些情况,尝试删除任何有关全屏设置的代码,以使上述解决方案之一奏效。

谢谢你的解决方案帮了我,我遇到了类似的问题,但是我在styles.xml中添加了全屏。 - Manohar

3
在我的情况下,我需要从我的样式中移除以下属性,才能使它正常工作。
<item name="android:windowFullscreen">true</item>

正常工作,谢谢。 - Zakaria Boukaddouss

1
我的问题出在HorizontalScrollView上。在我的情况下,我必须将HorizontalScrollView设置为:
android:layout_width="match_parent"
android:layout_height="match_parent"

并移除:

 android:layout_above="@+id/closeButton"
 android:layout_below="@+id/logo"

在AndroidManifest.xml中,活动被设置为:
android:windowSoftInputMode=""

我希望这能帮助到遇到这个奇怪的bug的人。

0
在我的情况下,解决此问题的方法是在底部设置缺失的约束条件。 我的ScrollView具有顶部、右侧和左侧约束条件,但没有底部约束条件。 在限制所有方向之后,它开始重叠上面的文本视图,这促使我尝试将其高度设置为0dp,并且似乎解决了该问题。

0
我遇到了同样的问题。
在改变之前。
android:windowSoftInputMode="adjustResize|adjustPan"

改变之后
android:windowSoftInputMode="adjustResize"

现在它运行良好,不需要做额外的锚点。

根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,以帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接