显示软键盘时向上移动布局?

Posted

技术标签:

【中文标题】显示软键盘时向上移动布局?【英文标题】:Move layouts up when soft keyboard is shown? 【发布时间】:2010-12-30 04:53:52 【问题描述】:

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

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

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

【问题讨论】:

android developers blog更新了参考 @Dinedal 你如何将 align bottom 属性设置为你的 RelativeView ??? 我发布了一个简单的解决方案,它不涉及向清单中添加任何内容。只是一个简单的布局,其余的由 android 处理。见***.com/questions/15323758/… 【参考方案1】:

是的,请查看 this article on the Android developers' site,它描述了框架如何处理出现的软键盘。

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

对我来说,即使我设置了 adjustPan screnn 也只能移动到我点击的编辑文本,而不是整个布局【参考方案3】:

为您的活动添加 AndroidManifest.xml:

android:windowSoftInputMode="adjustPan|adjustResize"

【讨论】:

根据文档,如果您在此处使用两个“调整...”标志,则行为未指定。见developer.android.com/guide/topics/manifest/…【参考方案4】:

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

android:windowSoftInputMode="adjustResize"

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

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

【讨论】:

为什么要使用不同的标志? 当前版本需要android前缀:android:windowSoftInputMode="adjustResize"【参考方案5】:

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

android:windowSoftInputMode="adjustPan"

修改如下

    AndroidManifest.xml

    android:windowSoftInputMode="stateVisible|adjustResize"

    style.xml 文件,活动风格

    是的

它对我有用。

【讨论】:

【参考方案6】:

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

 android:windowSoftInputMode="adjustResize"

对于 ScrollView 中的 RelativeLayout,设置:

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

会好的

【讨论】:

android:layout_gravity="center" 工作,谢谢! :) 现在 EditText 按我的意愿在键盘上移动【参考方案7】:

for Activity 在它的 oncreate 方法中插入下面的行

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

对于片段在其 onCreate 方法中

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

【讨论】:

它有效。谢谢! :)【参考方案8】:

向上滚动屏幕需要执行 3 个步骤。

    在清单文件中写入您的活动:

android:windowSoftInputMode="adjustResize"

    在活动的 oncreate() 方法中添加以下行

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

    然后将整个视图放在 XML 文件中的“Scrollview”中,例如:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:background="@drawable/bg"
    android:layout_ 
    > 
    <RelativeLayout
         android:layout_
        android:layout_
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

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

【讨论】:

【参考方案9】:
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

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

【讨论】:

【参考方案10】:

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

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

在activity_main.xml中:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_
    android:layout_
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_
    android:layout_
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

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

【讨论】:

【参考方案11】:

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

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

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

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

【讨论】:

为什么不发布代码,以便更好地理解? 我在上面贴了一个示例代码:***.com/a/31994697/2914140. 您可以通过使用ConstraintLayout 并将顶部部分固定在顶部并将底部部分固定在底部,以一种不那么老套的方式来实现这一点。当键盘打开时,它会自然地通过挤压中间的空间来调整大小(如果你使用adjustResize【参考方案12】:
    如果用户希望使用清单执行此任务,则在清单中添加此行 在清单中添加这一行: - android:windowSoftInputMode="adjustPan" 例如

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

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

【讨论】:

您好,欢迎来到 ***,感谢您的回答。您能否简单地解释一下您解决了什么问题以及您是如何解决的,而不是仅仅发布一段代码?这将有助于以后发现此问题的人更好地了解该问题以及如何处理它。【参考方案13】:

这是完整的清单代码

<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>

【讨论】:

【参考方案14】:

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

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

【讨论】:

stateVisible 在我的情况下丢失了。【参考方案15】:

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

android:fitsSystemWindows="true"

【讨论】:

@yash786 可能是在edittext下方显示按钮接收焦点?第二个问题你能分享你的布局文件或回答我你是如何在键盘顶部添加edittext的吗? 它适用于我没有 android:windowSoftInputMode="stateVisible|adjustResize" 的事件【参考方案16】:

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

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

【讨论】:

【参考方案17】:

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

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

android:windowSoftInputMode="stateHidden|adjustPan" 

代码应如下所示:

    <activity
        android:name=".MainActivity"
        android:screenOrientation="landscape"
        android:windowSoftInputMode="stateHidden|adjustPan">
    </activity>

【讨论】:

链接已损坏。 很抱歉。刚刚编辑了答案,尝试使用这个版本(将“stateVisible”更改为“stateHidden”并添加了“adjustPan”)。以前的版本现在也不适合我。【参考方案18】:

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

<EditText
android:id="@+id/et"
android:layout_
android:layout_



/>

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

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

【讨论】:

【参考方案19】:

没有一条建议可以解决我的问题。 调整平移几乎与调整大小工作一样。如果我设置 Adjust Nothing 而不是布局不会向上移动,但它会隐藏我正在编写的底部的编辑文本。所以经过 24 小时的持续搜索,我找到了this source,它解决了我的问题。

【讨论】:

【参考方案20】:

可能有点晚了,但我想补充几点。 在 Android Studio 4.0.1 版和 Gradle 6.1.1 版中,如果您在 Activity 中添加以下标志,windowSoftInputMode 将无法正常工作:

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

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

【讨论】:

【参考方案21】:

使用 Scroll View 作为 Parent 并在 Scroll View 中使用这个标签

android:fillViewport="true"

【讨论】:

【参考方案22】:

将这一行添加到视图中:

view.requestFocus();

【讨论】:

以上是关于显示软键盘时向上移动布局?的主要内容,如果未能解决你的问题,请参考以下文章

Android:关闭软键盘时显示空白

软键盘弹出的时候,如何让我的页面自动向上移动

软键盘弹出的时候,如何让我的页面自动向上移动

软输入键盘将我的静态底部视图向上移动 Android Kotlin

避免 android 软键盘调整布局大小。或回调隐藏视图

移动端软键盘弹出影响页面布局(iOS软键盘取消后,页面没有恢复),移动端软键盘监听(弹出,收起),及影响定位布局的问题