软键盘弹出时如何将布局上移?

181

我在一个RelativeLayout中有几个设置了align bottom属性的元素,当软键盘弹出时,这些元素被软键盘遮盖了。

我希望它们能够往上移,以便在屏幕空间足够的情况下显示在键盘上方,或者使键盘上方的区域可滚动,用户仍然可以看到这些元素。

有关于如何解决这个问题的任何想法吗?


Android开发者博客更新参考。 - Jayabal
@Dinedal,你如何将相对布局的底部对齐属性设置为底部对齐? - KJEjava48
我发布了一个简单的解决方案,不需要向清单添加任何内容。只需一个简单的布局,Android 就会处理其余的事情。请参见 https://dev59.com/aWUp5IYBdhLWcg3wXGsZ#67798240。 - Jeffrey
24个回答

128

是的,请查看Android开发者网站上的这篇文章,其中描述了框架如何处理软键盘的出现。

android:windowSoftInputMode 属性可用于指定每个活动的操作:是否调整布局大小或滚动等。


111

你也可以在onCreate()方法中使用这段代码:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

21
即使我使用了"adjustPan"属性,屏幕只会向上移动到我点击的EditText位置,而不是整个布局。 - murt

41

调整您的清单文件中的活动配置,例如:

android:windowSoftInputMode="adjustResize"

或者

在活动类中的 onCreate() 方法中进行更改,例如:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

15
为什么要使用不同的旗帜? - CoolMind
当前版本需要添加android前缀:android:windowSoftInputMode="adjustResize"。 - Andrea Leganza

37

在AndroidManifest.xml文件中添加您的活动:

android:windowSoftInputMode="adjustPan|adjustResize"

28
根据文档,如果在此处同时使用两个“adjust…”标志,则行为未指定。请参阅http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft - joe1806772

24

我在我的布局中使用了ScrollView,遇到了类似的问题。当我尝试选择EditText中的文本时,带有Copy/Cut/Paste操作的工具栏会随着下面的代码向上移动,但它不会重新调整布局大小。

android:windowSoftInputMode="adjustPan"

通过以下修改:

  1. AndroidManifest.xml

    android:windowSoftInputMode="stateVisible|adjustResize"

  2. 在activity的style中的style.xml文件中

    true

这对我很有效。


4
活动样式为真是什么意思? - Talha Ç

20
在AndroidManifest.xml中,不要忘记设置:

 android:windowSoftInputMode="adjustResize"

对于ScrollView中的RelativeLayout,请设置:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

一切都会好的


android:layout_gravity="center" 已经生效了,谢谢! :) 现在 EditText 按照我想要的方式移动到键盘上方。 - Pavel Biryukov

16
在Activity的onCreate方法中插入以下行:
在Activity的onCreate()方法中添加以下代码:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

并且在其onCreate方法中处理碎片

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

12

滚动屏幕有3个步骤。

  1. 在您的活动清单文件中编写:

android:windowSoftInputMode="adjustResize"

  1. 在您的活动的onCreate()方法中添加以下行:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. 然后在XML文件中将整个视图放置在“ScrollView”中,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

P.S.别忘了在父RelativeLayout中添加android:layout_gravity="center"。


9
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

将NestedScrollView添加到要滚动的布局周围,这样就可以完美地工作。

6
这是在查看了很多解决方案后适用于我的方法: 在你的项目的清单文件中,对一个活动进行声明,在AndroidManifest.xml中添加以下行。
android:windowSoftInputMode="stateHidden|adjustPan" 

代码应该长这样:
    <activity
        android:name=".MainActivity"
        android:screenOrientation="landscape"
        android:windowSoftInputMode="stateHidden|adjustPan">
    </activity>

链接已损坏。 - Jeffrey
抱歉,刚刚编辑了答案,请使用这个版本尝试(将“stateVisible”更改为“stateHidden”,并添加“adjustPan”)。之前的版本现在对我也不起作用。 - Martin Vichev

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