出现软键盘时如何调整布局

我想在激活软键盘时调整/重新排列布局,如下所示:

之前和之后:

在这里输入图像描述在这里输入图像描述


在SO中找到了一些资源:

  • 如何在显示软键盘时保持所有字段和文本可见
  • 出现时,Android软键盘会占用布局
  • 打开软键盘时调整布局

  • 但问题和答案很模糊,这是一个我想要的更清晰图像的问题。

    要求:

  • 它应该可以在任何屏幕尺寸的手机上工作。
  • 注意到“FACEBOOK”和“注册Facebook”的保证金/填充空间在之前和之后都发生了变化。
  • 不涉及滚动视图。

  • 只需添加

    android:windowSoftInputMode="adjustResize"
    

    在你的AndroidManifest.xml中声明这个特定的活动,这将调整布局调整大小选项。

    在这里输入图像描述

    一些源代码下面的布局设计

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="20dp"
            android:text="FaceBook"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    
        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView1"
            android:layout_marginTop="30dp"
            android:ems="10"
            android:hint="username" >
    
            <requestFocus />
        </EditText>
    
        <EditText
            android:id="@+id/editText2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/editText1"
            android:layout_marginTop="20dp"
            android:ems="10"
            android:hint="password" />
    
        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/editText2"
            android:layout_centerHorizontal="true"
            android:layout_marginLeft="18dp"
            android:layout_marginTop="20dp"
            android:text="Log In" />
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginTop="17dp"
            android:gravity="center"
            android:text="Sign up for facebook"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    
    </RelativeLayout>
    

    这个问题已经在几年前问过了,“Secret Andro Geni”有一个很好的基本解释,“tir38”也对完整的解决方案做了很好的尝试,但是在这里没有完整的解决方案。 我花了几个小时弄清楚事情,这里是我完整的解决方案,底部有详细的解释:

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp">
    
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_above="@+id/mainLayout"
                android:layout_alignParentTop="true"
                android:id="@+id/headerLayout">
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:gravity="center_horizontal">
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/textView1"
                        android:text="facebook"
                        android:textStyle="bold"
                        android:ellipsize="marquee"
                        android:singleLine="true"
                        android:textAppearance="?android:attr/textAppearanceLarge" />
    
                </LinearLayout>
    
            </RelativeLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:id="@+id/mainLayout"
                android:orientation="vertical">
    
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/editText1"
                    android:ems="10"
                    android:hint="Email or Phone"
                    android:inputType="textVisiblePassword">
    
                    <requestFocus />
                </EditText>
    
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:id="@+id/editText2"
                    android:ems="10"
                    android:hint="Password"
                    android:inputType="textPassword" />
    
                <Button
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:id="@+id/button1"
                    android:text="Log In"
                    android:onClick="login" />
    
            </LinearLayout>
    
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_below="@+id/mainLayout"
                android:id="@+id/footerLayout">
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true">
    
                    <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content">
    
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:id="@+id/textView2"
                            android:text="Sign Up for Facebook"
                            android:layout_centerHorizontal="true"
                            android:layout_alignBottom="@+id/helpButton"
                            android:ellipsize="marquee"
                            android:singleLine="true"
                            android:textAppearance="?android:attr/textAppearanceSmall" />
    
                        <Button
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_alignParentRight="true"
                            android:id="@+id/helpButton"
                            android:text="?"
                            android:onClick="help" />
    
                    </RelativeLayout>
    
                </LinearLayout>
    
            </RelativeLayout>
    
        </RelativeLayout>
    
    </ScrollView>
    

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

    android:windowSoftInputMode="adjustResize"
    

    在你想要这样的布局的<activity>标签上。

    思考:

    我已经意识到, RelativeLayout是跨越所有可用空间的布局,然后在弹出键盘时调整大小。

    LinearLayout是在调整大小过程中不调整大小的布局。

    这就是为什么你需要在ScrollView之后立即有1个RelativeLayout来跨越所有可用的屏幕空间。 而且你需要在RelativeLayout有一个LinearLayout否则在调整大小时你的内部会被压坏。 很好的例子是“headerLayout”。 如果在那个RelativeLayout里没有LinearLayout ,那么“facebook”文本会被压缩并且不会被显示。

    在问题中发布的“facebook”登录图片中,我也注意到整个登录部分(mainLayout)相对于整个屏幕垂直居中,因此属性为:

    android:layout_centerVertical="true"
    

    LinearLayout布局上。 而且因为mainLayout在LinearLayout内部,这意味着该部分不会被调整大小(再次查看有问题的图片)。


    在你的活动被调用的Manifest中添加这一行

    android:windowSoftInputMode="adjustPan|adjustResize"
    

    要么

    你可以在你的onCreate添加这一行

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    
    链接地址: http://www.djcxy.com/p/16681.html

    上一篇: How to adjust layout when soft keyboard appears

    下一篇: How to hide Android soft keyboard on EditText