我在设置了 align bottom 属性的 RelativeView 中有一些元素,当软键盘出现时,这些元素被软键盘隐藏。
我希望它们向上移动,以便如果有足够的屏幕空间,它们会显示在键盘上方,或者使键盘上方的部分可滚动,以便用户仍然可以看到元素。
关于如何解决这个问题的任何想法?
是的,请查看 this article on the Android developers' site,它描述了框架如何处理出现的软键盘。
android:windowSoftInputMode
属性可用于指定每个活动发生的情况:是否调整布局大小或是否滚动等。
您也可以在 onCreate()
方法中使用此代码:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
为您的活动添加 AndroidManifest.xml:
android:windowSoftInputMode="adjustPan|adjustResize"
更改清单文件的活动,例如
android:windowSoftInputMode="adjustResize"
或者
在 Activity 类中更改您的 onCreate()
方法,例如
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
我在布局中遇到了类似的问题,其中包含滚动视图。每当我尝试在 EditText 中选择文本时,复制/剪切/粘贴操作栏都会使用下面的代码向上移动,因此它不会调整布局大小
android:windowSoftInputMode="adjustPan"
通过将其修改为如下
AndroidManifest.xml android:windowSoftInputMode="stateVisible|adjustResize" style.xml 文件,活动风格为 true
它对我有用。
在 AndroidManifest.xml 中,别忘了设置:
android:windowSoftInputMode="adjustResize"
对于 ScrollView 内的 RelativeLayout ,设置:
android:layout_gravity="center" or android:layout_gravity="bottom"
会没事儿的
对于 Activity 在其 oncreate 方法中插入以下行
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
以及 onCreate 方法中的片段
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
向上滚动屏幕有 3 个步骤。
为您的活动写入清单文件:
android:windowSoftInputMode="adjustResize"
在活动的 oncreate() 方法中添加以下行
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
然后将您的整个视图放在 XML 文件中的“Scrollview”中,例如:
PS 不要忘记在父相对布局中添加 android:layout_gravity="center" 。
<activity name="ActivityName"
android:windowSoftInputMode="adjustResize">
...
</activity>
在要滚动的布局周围添加 NestedScrollView,这将完美地工作
我尝试了 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>
我找到了一个解决我的问题的方法,它和你的差不多。
首先,我只有一个带有 2 个元素的 LinearLayout,一个 ImageView 和一个包含 2 个 EditText 和一个 Button 的 LinearLayout,所以我需要在没有键盘的情况下将它们分开全屏,当键盘出现时,它们应该看起来更近一些。
所以我在它们之间添加了视图,高度属性为 0dp,重量为 1,这让我的视图彼此分开。当键盘出现时,由于它们没有固定高度,它们只是调整大小并保持外观。
瞧!当键盘存在或不存在时,布局调整大小和视图之间的距离是相同的。
ConstraintLayout
并将顶部固定到顶部并将底部固定到底部,以一种不那么老套的方式实现这一点。当键盘打开时,它会自然地通过挤压中间的空间来调整大小(如果你使用 adjustResize
)
我刚刚在顶层布局中添加了以下行,一切正常:
android:fitsSystemWindows="true"
如果用户希望使用清单执行此任务,则在清单中添加此行 在清单中添加此行: - android:windowSoftInputMode="adjustPan" 例如
在 Java 文件或 Kotlin 文件中(以编程方式):- 如果用户想要使用 Activity,则在 onCreate 方法中添加以下行
activity?.window()?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
这是完整的清单代码
<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>
在您的清单文件中添加以下行。它会工作
<activity name="MainActivity"
android:windowSoftInputMode="stateVisible|adjustResize">
...
</activity>
如果您处于片段中,那么您必须将以下代码添加到您的活动中的 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**
这是唯一对我有用的解决方案。
没有一个建议可以解决我的问题。 调整平移几乎与调整大小工作一样。如果我设置 Adjust Nothing 而不是布局不会向上移动,但它会隐藏我正在编写的底部的编辑文本。因此,经过 24 小时的持续搜索,我找到了 this source,它解决了我的问题。
可能有点晚了,但我想补充几点。在 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
);
在浪费了很多时间之后,我发现了那个黑客。为了使 adjustResize
或 AdjustPan
或 windowSoftInputMode
的任何属性正常工作,您需要将其从您的活动中删除。
使用 Scroll View 作为父级并在 Scroll View 中使用此标记
机器人:fillViewport="真"
将此行添加到视图中:
view.requestFocus();
在查看了很多解决方案后,这对我有用:
在 AndroidManifest.xml
中,将以下行添加到项目清单文件中的活动声明中。
android:windowSoftInputMode="stateHidden|adjustPan"
代码应如下所示:
<activity
android:name=".MainActivity"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateHidden|adjustPan">
</activity>