出现软键盘时如何调整布局
我想调整/重新调整软键盘的布局,如下图所示:
之前和之后:
在SO中find了一些资源:
- 如何在显示软键盘时保持所有字段和文本可见
- 出现的时候,android软键盘会破坏布局
- 软键盘开启时调整布局
但是问题和答案是相当含糊的,下面是我想要的更清晰的问题。
要求:
- 它应该在任何屏幕尺寸的手机上工作。
- 注意到“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"/>
现在是最重要的部分! 在Activity
或Application
标签中使用这样的主题。
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应用程序清单