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


139

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

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

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


从更新的参考Android开发者博客
Jayabal

@Dinedal您如何将align bottom属性设置为ur RelativeView?
KJEjava48'9

Answers:



95

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

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

11
对我来说,即使我将adjustPan screnn设置为仅移至我单击的编辑文本,但也不会
移至


22

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

windowSoftInputMode="adjustResize"

要么

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

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

11
为什么使用不同的标志?
CoolMind

当前版本需要android前缀:android:windowSoftInputMode =“ adjustResize”
Andrea Leganza

21

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

android:windowSoftInputMode="adjustPan"

通过如下修改

1)AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2)style.xml文件,处于活动样式

<item name="android:windowActionBarOverlay">true</item>

有效。!!!!!!!!!!!!


18

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

 android:windowSoftInputMode="adjustResize"

并为ScrollView中的RelativeLayout设置:

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

会好起来的


android:layout_gravity =“ center”正常工作,谢谢!:)现在,EditText可根据需要在键盘上移动
Pavel Biryukov,

11

在其oncreate方法中为Activity添加行

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

以及其onCreate方法中的片段

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

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


6

我尝试了迭戈·拉米雷斯(DiegoRamí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>


3

我找到了与您的问题完全相同的解决方案。

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

因此,我在视图之间添加了高度属性为0dp和权重为1的视图,这些视图使我的视图彼此分开。当键盘贴合时,因为它们没有固定的高度,所以它们只是调整大小并保持外观。

瞧!无论是否使用键盘,布局调整大小和视图之间的距离都相同。


6
您为什么不发布代码,以获得更好的理解?
johnkarka,2015年

我在上面发布了示例代码:stackoverflow.com/a/31994697/2914140
CoolMind

您可以通过使用,ConstraintLayout然后将顶部固定在顶部,将底部固定在底部,以减少黑客攻击的方式实现这一目标。当键盘打开时,它将自然地通过压缩中间的空格(如果您使用adjustResize)来调整大小
hmac

2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

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

嗨,欢迎来到stackoverflow,谢谢您的回答。您不仅可以发布一段代码,还可以简短说明一下您所解决的问题以及如何解决该问题?这将有助于以后发现此问题的人们更好地理解该问题以及如何处理它。
Plutian

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>

1

如果您处于碎片状态,则必须在活动中将以下代码添加到onCreate上,这将为我解决问题

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


1

我只是将以下行添加到顶层布局,并且一切正常:

android:fitsSystemWindows="true"

@ yash786可能是edittext下面显示焦点的按钮?第二个问题是您可以共享布局文件还是可以回答我如何在键盘顶部添加edittext?
Heroes84

它适用于没有android:windowSoftInputMode =“ stateVisible | adjustResize”事件的我
缩放

0

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

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

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


0

没有一个建议可以解决我的问题。调整平移几乎就像调整调整大小一样。如果我设置了Adjust Nothing,那么布局不会向上移动,但是会隐藏我正在写的底部的edittext。因此,经过24小时的连续搜索,我找到了这个来源,并且可以解决我的问题。


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

在浪费了很多时间之后,我发现了这个hack。为了使adjustResize或的AdjustPan任何属性windowSoftInputMode正常工作,您需要从活动中删除该属性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.