当软键盘显示时移动布局?

我在 RelativeView 中有几个元素,设置了对齐的底部属性,当软键盘出现时,这些元素被软键盘隐藏起来。

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

有什么办法吗?

247812 次浏览

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

android:windowSoftInputMode属性可以用来指定在每个活动的基础上会发生什么: 布局是调整大小还是滚动等等。

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

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

为您的活动添加 AndroidManifest.xml:

android:windowSoftInputMode="adjustPan|adjustResize"

在 Manifest 文件的活动中进行更改,如

android:windowSoftInputMode="adjustResize"

或者

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

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

我已经找到了解决我问题的方法,它和你的问题很相似。

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

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

瞧! 布局调整和视图之间的距离是相同的时候键盘是否存在。

这是完整的货单代码

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

类似的问题,我面临与我的布局,其中包括内部滚动视图。 每当我尝试在 EditText 中选择文本时,复制/剪切/粘贴操作栏会随着下面的代码向上移动,因此它不会调整布局大小

android:windowSoftInputMode="adjustPan"

修改如下

  1. AndroidManifest.xml

    Android: windowSoftInputMode = “ stateVisible | adjResize”

  2. Xml 文件,活动样式

    没错

这招对我很管用。

我试过 Diego Ramírez 的方法,很管用。 返回文章页面 Android 宣言:

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

在 oncreate 方法中插入以下一行

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

以及 onCreate 方法中的片段

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

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

 android:windowSoftInputMode="adjustResize"

对于 ScrollView 中的 RelativeLayout,设置:

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

会没事的

向上滚动屏幕有3个步骤。

  1. 为您的活动写入清单文件:

Android: windowSoftInputMode = “调整大小”

  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>

附注: 不要忘记在父级相对布局中添加 android。

如果你是在片段,那么你必须添加下面的代码到您的 onCreate 在您的活动它解决了我的问题

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

好吧,这是非常晚,但我已经发现,如果你添加一个列表视图下的编辑文本,然后键盘将移动该编辑文本下的所有布局,而不移动列表视图

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

这是我唯一的解决办法。

在清单文件中添加以下行

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

我只是在顶层布局中添加了下面这行代码,所有的代码都工作正常:

android:fitsSystemWindows="true"
  1. 如果用户希望此任务使用清单,则在清单中添加此行
  2. 在清单中添加以下行:-android: windowSoftInputMode = “ adjPan” 例如:。

在 Java 文件或 Kotlin 文件中(以编程方式) :-如果用户希望使用 Activity 实现这一点,那么在 onCreate 方法中添加以下一行

activity?.window()?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
<activity name="ActivityName"
android:windowSoftInputMode="adjustResize">
...
</activity>

在要滚动的布局周围添加 NestedScrollView,这将非常有效

没有一个建议能解决我的问题。调整平底锅几乎和工作 调整大小一样。如果我设置 什么都不要调整比布局没有向上移动,但它隐藏我的底部编辑文本,我正在写。因此,经过24小时的不断搜索,我找到了 这个来源,它解决了我的问题。

可能有点晚了,但我想补充一些东西。 在 Android Studio Version 4.0.1和 Gradle Version 6.1.1中,如果在活动中添加以下标志,则 windowSoftInputMode将不能正常工作:

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

在浪费了很多时间之后,我找到了那个黑客。为了使 adjustResizeAdjustPanwindowSoftInputMode的任何属性正常工作,您需要从您的活动中删除该属性。

使用滚动视图作为父视图并在滚动视图中使用此标记

Android: filViewport = “ true”

这就是我在考虑了很多解决方案后得出的结论:

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

android:windowSoftInputMode="stateHidden|adjustPan"

代码应该是这样的:

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

将这一行添加到视图中:

view.requestFocus();