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

我想调整/重新调整软键盘的布局,如下图所示:

之前和之后:

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


在SO中find了一些资源:

  1. 如何在显示软键盘时保持所有字段和文本可见
  2. 出现的时候,android软键盘会破坏布局
  3. 软键盘开启时调整布局

但是问题和答案是相当含糊的,下面是我想要的更清晰的问题。

要求:

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

只需添加

android:windowSoftInputMode="adjustResize" 

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

在这里输入图像描述

一些源代码下面的布局devise

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

这个问题早在几年前就已经提出过了,“安德烈·吉尼秘密”有一个很好的基础解释,“tir38”也对这个完整的解决scheme做了很好的尝试,但是这里没有完整的解决办法。 我花了几个小时弄清楚事情,这里是我的完整解决scheme,底部有详细的解释:

 <?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是跨越所有可用空间的布局,然后在popup键盘时resize。

LinearLayout是在resize过程中不resize的布局。

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

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

 android:layout_centerVertical="true" 

LinearLayout布局上。 而且因为mainLayout在LinearLayout这意味着那个部分不会被resize(再次看到有问题的图片)。

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

 android:windowSoftInputMode="adjustPan|adjustResize" 

要么

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

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

Android开发人员有正确的答案,但是提供的源代码非常冗长,并没有实际实现图中描述的模式。

这是一个更好的模板:

 <?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="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- stuff to scroll --> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> <!-- footer --> </FrameLayout> </RelativeLayout> </ScrollView> 

它取决于你决定什么意见您使用的“滚动”和“页脚”部分。 也知道你可能要设置ScrollView的fillViewPort 。

在我的情况下,它有帮助。

main_layout.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main2" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.livewallpaper.profileview.loginact.Main2Activity"> <TextView android:layout_weight="1" android:layout_width="match_parent" android:text="Title" android:gravity="center" android:layout_height="0dp" /> <LinearLayout android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp"> <EditText android:hint="enter here" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <TextView android:layout_weight="1" android:text="signup for App" android:gravity="bottom|center_horizontal" android:layout_width="match_parent" android:layout_height="0dp" /> </LinearLayout> 

manifest文件中使用这个

 <activity android:name=".MainActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize"/> 

现在是最重要的部分! 在ActivityApplication标签中使用这样的主题。

 android:theme="@style/AppTheme" 

主题就是这样

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="windowActionModeOverlay">true</item> </style> 

所以我错过了这个主题。 这让我整天感到沮丧。

您可以简单地在AndroidManifest.xml文件中设置这些选项。

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

Google不build议使用adjustPan ,因为用户可能需要closures键盘才能看到所有的input字段。

更多信息: Android应用程序清单