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

181

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

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

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


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

6

我尝试了Diego Ramírez的一个方法,它有效。在AndroidManifest文件中:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

在activity_main.xml文件中:
<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>

4
我刚刚在顶级布局中添加了以下行,并且一切都正常工作了:
android:fitsSystemWindows="true"

1
@yash786 可能会在EditText下方显示一个按钮来接收焦点吗?第二个问题是,您可以分享您的布局文件或回答我如何将EditText添加到键盘顶部吗? - Heroes84
即使没有android:windowSoftInputMode="stateVisible|adjustResize",它对我也有效。 - zoom

3
我已经找到了一个解决方案,它与你的问题非常相似。
首先,我只有一个LinearLayout,并包含两个元素,一个ImageView和一个LinearLayout,其中包含2个EditText和一个Button,因此我需要将它们分开成全屏显示,当键盘出现时,它们应该更加接近。
所以我在它们之间添加了一个视图,高度属性设为0dp,权重为1,这允许我保持我的视图彼此分离。当键盘出现时,它们由于没有固定高度,所以只需调整大小并保持比例。
完成啦!布局调整后,当键盘存在或不存在时,我的视图之间的距离是相同的。

8
请发布代码以便更好理解。 - johnkarka
我在上面发布了一个示例代码:https://dev59.com/d3I-5IYBdhLWcg3wN1hD#31994697。 - CoolMind
你可以通过使用ConstraintLayout将顶部部分固定在顶部,底部部分固定在底部的方式来实现更加优雅的效果。当键盘打开时,它会自然地通过挤压中间的空间来调整大小(如果您使用adjustResize)。 - hmac

3
  1. 如果用户想要使用清单文件来执行此任务,请在清单文件中添加以下行:
  2. 在清单文件中添加以下行:- android:windowSoftInputMode="adjustPan" 例如:

在Java文件或Kotlin文件中(通过编程方式):- 如果用户想要在Activity中使用此功能,则在onCreate方法中添加以下行:

activity?.window()?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)

你好,欢迎来到stackoverflow,并感谢您的回答。与其只发布一段代码块,不如简要解释一下您解决的问题以及您是如何解决它的。这将有助于未来发现此问题的人更好地理解问题并处理它。 - Plutian

2
使用滚动视图作为父级,并在滚动视图中使用此标记。
android:fillViewport="true"

2

以下是完整的清单代码

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        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
如果您处于片段中,则需要将以下代码添加到您的活动的onCreate中,它对我解决了问题。
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

1
我尝试了很多方法,但最后我在AndroidManifest.xml文件中添加了这行代码,结果完美解决了问题。
<activity
      ...
      android:windowSoftInputMode="adjustPan|adjustResize"

1
在你的清单文件中添加以下行。它会起作用。

在您的清单文件中添加以下行。它会起作用。

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>

我的情况下缺少了 stateVisible。 - JacksOnF1re

0
将此行添加到视图中:
view.requestFocus();

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