软键盘弹出时页面滚动

110

我有一个<ScrollView>布局:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_scrollview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >

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

        <EditText
            android:id="@+id/input_one"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_two"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_three"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

          <Button
            android:id="@+id/ok_btn"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:text="@string/ok_str" />

      </LinearLayout>
</ScrollView>

如上所示,简单的布局由三个输入字段和一个“确认”按钮组成。

当我使用上述布局运行我的应用程序时,当我点击第一个输入字段 (@+id/input_one) 时,软键盘将从屏幕底部弹出,它会隐藏第三个输入字段和“确认”按钮。

由于我使用了<ScrollView>,所以我认为可以将页面向上滚动以查看被软键盘隐藏的第三个输入字段和“确认”按钮,但是页面无法滚动。为什么?如何解决?基本上,我希望即使软键盘弹出,也能看到每个输入字段和“确认”按钮。


1
删除<ScrollView>,LinearLayout应该是你的外部布局,这样做就可以了,我希望即使软键盘弹出也能正常工作。 - aalionline
1
@pakshaheen 当需要滚动视图时,那并不能解决问题。 - Luten
这是可工作的代码。https://dev59.com/XGs05IYBdhLWcg3wJurp#44242034 - Venkat
10个回答

136

我通过在AndroidManifest.xml文件中<activity>标签中定义以下属性来解决了问题。

android:windowSoftInputMode="adjustResize"

13
不需要使用stateVisible。这会导致应用程序启动时软键盘出现,即使用户没有聚焦在EditText上也会出现。 - RajV
1
即使没有EditText,它也会自动打开键盘。 - Mr X

39

好的,我现在已经搜索了几个小时以找到问题,并且我找到了它。

fillViewport="true"android:windowSoftInputMode="adjustResize"之类的更改都没有帮助我。

我使用的是Android 4.4,这是一个大错误

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

在软键盘弹出时,全屏主题会阻止滚动视图的滚动。

目前,我改用了这种方法:

Somehow, the Fullscreen themes prevent the ScrollViews from scrolling when the SoftKeyboard is visible.

At the moment, I ended up using this instead:

android:theme="@android:style/Theme.Black.NoTitleBar

我不知道如何去除顶部系统栏上的时间和电池显示,但至少我解决了这个问题。

希望这能帮助到其他遇到同样问题的人。

编辑:我想出了一个小技巧来解决我的情况,所以我在这里发布了它:

我不确定这对你是否有用,但这肯定会帮助你理解并解决一些问题。

编辑2:这里还有另一个好的主题,将帮助您朝着正确的方向前进甚至解决您的问题。


1
在我的情况下,状态栏被第三方库隐藏了,代码如下:getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - de.
如果我需要全屏和滚动,怎么办? - Prabs
@Prabs 你找到解决方案了吗?我也想要全屏和滚动。 - Johny
@Johny 不是的。目前我在整个应用程序中都使用全屏,除了那个带有滚动条的活动。 - Prabs
@Prabs 我想到的唯一解决方案是使用透明状态栏,但在我的情况下仍然存在问题,因为我想要支持API >= 16。你有什么想法吗? - Johny

20

对我而言,唯一有效的方法是在清单文件中加入此属性:

android:windowSoftInputMode="stateHidden|adjustPan"

在打开活动时不显示键盘,且不要覆盖视图底部。


14

在非全屏模式下,将此内容放入您的清单中,就像这样

android:windowSoftInputMode="stateVisible|adjustPan" 

在你的清单文件中

<activity
    android:windowSoftInputMode="stateVisible|adjustPan"
    android:name="com.example.patronusgps.MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

1
我已经尝试过这个,但不幸的是,完全没有运气... 然而,根视图并不是 ScrollView,而是一个包含 LinearLayoutRelativeLayout,然后再包含一个 ScrollView - James Heald

11

在您的Manifest中定义windowSoftInputMode属性:

<activity android:name=".MyActivity"
          android:windowSoftInputMode="adjustNothing">

2
@JacobRas 请查看此链接:http://developer.android.com/reference/android/R.attr.html#windowSoftInputMode 它的值为"adjustNothing" :) - Mohammad Ersan
2
我也遇到了同样的问题,但是使用adjustNothing时scrollview无法工作 :( - Narendra Singh

7

请看这个。

<activity android:name=".Calculator"
    android:windowSoftInputMode="stateHidden|adjustResize" 
    android:theme="@android:style/Theme.Black.NoTitleBar">
</activity>

2

这仅适用于我:

android:windowSoftInputMode="adjustPan"

2
您可以尝试使用下面的代码来解决问题:
 <activity
     android:name=".DonateNow"
     android:label="@string/title_activity_donate_now"
     android:screenOrientation="portrait"
     android:theme="@style/AppTheme"
     android:windowSoftInputMode="stateVisible|adjustPan">
 </activity>

19
你应该花些心思解释你的代码是做什么的,而不仅仅只是发布一段干巴巴的代码。这样才能更好地回答问题。 - Angel Politis

2
如果您想以编程的方式完成这个操作,只需在活动的onCreate方法中添加以下代码即可。 "Original Answer" 的意思是 "最初的回答"。
getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | 
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE );

0

嗯,我尝试的最简单的答案就是删除使活动全屏的代码。我有一个类似这样的代码,它负责让我的活动全屏:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

    getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
    );
}

我刚刚删除了我的代码,现在它完全正常工作,但是如果你想让它在全屏模式下工作,那么你就必须尝试其他方法。


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