在平时做项目的时候,美工经常会把登陆页面的输入框放在窗口底部(如图一),但他们一般不会去考虑输入法框弹出之后界面是什么样子的,所以会遇到输入法框就会出现背景上移或压缩的问题(如图二),而我们希望是某一区域的布局上移(如图三)。
…………………….
首先我们需要了解一下android:windowSoftInputMode 属性,
该属性是 AndroidMainifest 中的activity标签的属性之一,它有以下属性值:
stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
stateHidden:用户选择activity时,软键盘总是被隐藏
stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
stateVisible:软键盘通常是可见的
stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
解决方案:
设置android:windowSoftInputMode=”adjustResize”,然后在输入框区域加上android:fitsSystemWindows=”true”即可,注意当设置windowSoftInputMode属性为adjustResize,fitsSystemWindows属性只能被调用一次,若是布局文件中有两处使用到了该属性,只能实现第一个被设置的控件上移。
警告:
上述方案在android4.4版本以下会出现背景压缩问题,需要在activity的onCreate方法里添加如下代码,要放在setContentView()方法之前。
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT){
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;//设置全屏但不隐藏状态栏
decorView.setSystemUiVisibility(option);
}
布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
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:background="@mipmap/login_bg"
tools:context="com.feeling.login.activity.LoginActivity">
<!--在你想上移的区域加上android:fitsSystemWindows="true",我的加在了这里-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:fitsSystemWindows="true">
<EditText
android:id="@+id/account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/activity_vertical_margin"
android:background="@drawable/login_edittext_bg"
android:layout_marginBottom="5dp"
android:hint="@string/account"/>
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/activity_vertical_margin"
android:background="@drawable/login_edittext_bg"
android:layout_marginBottom="5dp"
android:hint="@string/password"/>
<Button
android:id="@+id/login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Base.Widget.AppCompat.Button.Colored"
android:text="@string/login"/>
</LinearLayout>
</RelativeLayout>