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

时间:2009-12-27 00:40:31

标签: android user-interface android-layout android-keypad

我在RelativeView中有一些元素设置了对齐底部属性,当软键盘出现时,软键盘隐藏了元素。

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

有关如何处理此事的任何想法?

22 个答案:

答案 0 :(得分:91)

是的,请查看this article on the Android developers' site,其中介绍了框架如何处理出现的软键盘。

android:windowSoftInputMode属性可用于指定基于每个活动的内容:布局是否已调整大小或是否滚动等。

答案 1 :(得分:73)

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

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

答案 2 :(得分:30)

为您的活动添加AndroidManifest.xml:

android:windowSoftInputMode="adjustPan|adjustResize"

答案 3 :(得分:21)

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

windowSoftInputMode="adjustResize"

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

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

答案 4 :(得分:15)

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

android:windowSoftInputMode="adjustPan"

将其修改为如下

1)AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

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

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

它奏效了。!!!!!!!!!!!!

答案 5 :(得分:12)

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

 android:windowSoftInputMode="adjustResize"

并且对于ScrollView中的RelativeLayout,设置:

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

没关系

答案 6 :(得分:7)

用于活动在其下面的oncreate methode插入

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

和onCreate方法中的片段

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

答案 7 :(得分:6)

滚动屏幕有三个步骤。

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

    机器人:windowSoftInputMode = “adjustResize”

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

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

      1. 然后将整个视图放在XML文件中的“Scrollview”中,如:
      2. <?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>
        

        P.S。不要忘记在父相对布局中添加android:layout_gravity =“center”。

答案 8 :(得分:5)

我尝试了迭戈拉米雷斯的方法,它有效。 在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>

答案 9 :(得分:4)

我找到了解决问题的方法,它与你的问题非常相似。

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

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

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

答案 10 :(得分:1)

如果你是片段,那么你必须将以下代码添加到你的onCreate上,它解决了我的问题

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

答案 11 :(得分:1)

在清单文件中添加以下行。会起作用

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

答案 12 :(得分: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>

答案 13 :(得分: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**

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

答案 14 :(得分:0)

enter image description here

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    app:elevation="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay"/>

</android.support.design.widget.AppBarLayout>

答案 15 :(得分:0)

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

android:fitsSystemWindows="true"

答案 16 :(得分:0)

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

答案 17 :(得分:0)

<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

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

答案 18 :(得分:0)

没有一个建议可以解决我的问题。 调整平移几乎就像工作调整大小一样。如果我设置什么都不调整,则布局不会上移,但会隐藏我正在适当书写的底部编辑文本。因此,经过24小时的连续搜索,我发现{{3}}可以解决我的问题。

答案 19 :(得分:0)

可能已经晚了,但我想补充一点。 在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
        );

在浪费大量时间后,我发现了该漏洞。为了使adjustResizeAdjustPanwindowSoftInputMode的任何属性正常工作,您需要将其从活动中删除。

答案 20 :(得分:0)

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

android:fillViewport =“ true”

答案 21 :(得分:0)

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

AndroidManifest.xml

Add 

    android:windowSoftInputMode="stateHidden|adjustPan" 

to an activity declaration in manifest:

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