169

我在设置了 align bottom 属性的 RelativeView 中有一些元素,当软键盘出现时,这些元素被软键盘隐藏。

我希望它们向上移动,以便如果有足够的屏幕空间,它们会显示在键盘上方,或者使键盘上方的部分可滚动,以便用户仍然可以看到元素。

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

4

22 回答 22

118

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

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

于 2009-12-27T01:44:18.437 回答
105

您也可以在onCreate()方法中使用此代码:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
于 2013-02-25T09:13:17.647 回答
36

为您的活动添加 AndroidManifest.xml:

android:windowSoftInputMode="adjustPan|adjustResize"
于 2013-10-16T15:00:57.720 回答
32

更改清单文件的活动,例如

android:windowSoftInputMode="adjustResize"

或者

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
于 2014-04-30T06:57:05.147 回答
23

我在布局中遇到了类似的问题,其中包含滚动视图。每当我尝试在 EditText 中选择文本时,复制/剪切/粘贴操作栏都会使用下面的代码向上移动,因此它不会调整布局大小

android:windowSoftInputMode="adjustPan"

通过将其修改为如下

  1. AndroidManifest.xml

    android:windowSoftInputMode="stateVisible|adjustResize"

  2. style.xml 文件,活动风格

    真的

它对我有用。

于 2015-07-31T09:00:51.020 回答
19

在 AndroidManifest.xml 中,别忘了设置:

 android:windowSoftInputMode="adjustResize"

对于 ScrollView 内的 RelativeLayout ,设置:

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

会好起来的

于 2016-06-29T07:27:12.037 回答
13

对于 Activity 在其 oncreate 方法中插入以下行

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

以及 onCreate 方法中的片段

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
于 2016-03-10T10:58:01.330 回答
10

向上滚动屏幕有 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>

PS 不要忘记在父相对布局中添加 android:layout_gravity="center" 。

于 2016-10-05T07:04:39.030 回答
9
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

在要滚动的布局周围添加 NestedScrollView,这将完美地工作

于 2019-12-20T07:42:05.147 回答
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>
于 2015-08-13T17:21:27.847 回答
3

我找到了一个解决我的问题的方法,它和你的差不多。

首先,我只有一个带有 2 个元素的 LinearLayout,一个 ImageView 和一个包含 2 个 EditText 和一个 Button 的 LinearLayout,所以我需要在没有键盘的情况下将它们分开全屏,当键盘出现时,它们应该看起来更近一些。

所以我在它们之间添加了视图,高度属性为 0dp,重量为 1,这让我的视图彼此分开。当键盘出现时,由于它们没有固定高度,它们只是调整大小并保持外观。

瞧!当键盘存在或不存在时,布局调整大小和视图之间的距离是相同的。

于 2014-12-10T22:05:43.070 回答
3
  1. 如果用户希望使用清单执行此任务,则将此行添加到清单中
  2. 在清单中添加这一行: - android:windowSoftInputMode="adjustPan" 例如

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

activity?.window()?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
于 2019-12-03T08:45:36.127 回答
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>
于 2015-07-31T06:25:29.427 回答
2

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

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
于 2019-02-03T18:43:50.550 回答
2

我刚刚在顶层布局中添加了以下行,一切正常:

android:fitsSystemWindows="true"
于 2019-06-27T08:54:25.340 回答
1

如果您处于片段中,那么您必须将以下代码添加到您的活动中的 onCreate 它为我解决了问题

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
于 2017-07-07T11:15:18.680 回答
1

在查看了很多解决方案后,这对我有用:

AndroidManifest.xml将以下行添加到项目清单文件中的活动声明中。

android:windowSoftInputMode="stateHidden|adjustPan" 

代码应如下所示:

    <activity
        android:name=".MainActivity"
        android:screenOrientation="landscape"
        android:windowSoftInputMode="stateHidden|adjustPan">
    </activity>
于 2021-02-25T13:08:58.993 回答
0

好吧,这已经很晚了,但是我发现如果您在编辑文本下添加一个列表视图,那么键盘将移动该编辑文本下的所有布局而不移动列表视图

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

这是唯一对我有用的解决方案。

于 2018-07-01T01:44:14.670 回答
0

没有一个建议可以解决我的问题。调整平移几乎就像工作调整调整大小一样。如果我设置了只调整布局而不是向上移动,但它隐藏了我正在编写的底部的编辑文本。因此,经过 24 小时的持续搜索,我找到了这个来源,它解决了我的问题。

于 2020-06-19T21:18:32.813 回答
0

可能有点晚了,但我想补充几点。在 Android Studio 版本 4.0.1 和 Gradle 版本 6.1.1 中, windowSoftInputMode 如果您在 Activity 中添加以下标志,则不会按预期工作:

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

在浪费了很多时间之后,我发现了那个黑客。为了使adjustResizeorAdjustPan的任何属性windowSoftInputMode正常工作,您需要将其从您的活动中删除。

于 2020-07-28T06:42:33.107 回答
0

使用 Scroll View 作为父级并在 Scroll View 中使用此标记

机器人:fillViewport="真"

于 2020-11-12T13:28:22.440 回答
0

将此行添加到视图中:

view.requestFocus();
于 2021-11-06T18:30:25.727 回答