在开发中,我们经常会用到EditText,这就无可避免的会遇到软键盘弹出遮挡布局的问题,通常情况下我们可以设置AndroidManifist.xml来设置对应的属性。
1.stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
2.stateUnchanged当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
3.stateHidden用户选择activity时,软键盘总是被隐藏
4.stateAlwaysHidden:即使Activity主窗口获取到焦点,软键盘也总是被隐藏的
5.stateVisible:软键盘通常是可见的
6.stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
7.adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
8.adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
9.adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
一般情况下我使用的较多的是adjustPan,自动适应,但是这个属性经常会把布局顶上去,这就比较坑爹了,尤其是有时候会把标题栏都抵上去,而且只会刚好露出焦点,部分输入框是被遮挡的,如下图:
正常情况下,未弹出的时候
点击输入框,弹出之后
大写的丑,用户体验非常不好。仔细思考一下,软键盘也就相当于是一个布局,弹出的时候就相当于在我们的布局下方加入了一个布局,上顶相当于是一个滑动的问题,那么如果在除标题栏以外的地方嵌套一个ScrollView是不是就能避免标题栏被抵上去呢,果然,这么一试就成了。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/talk_list_tool_bar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/blue_titlebar"
android:elevation="4dp"
android:gravity="center"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:ellipsize="end"
android:singleLine="true"
android:text="对话记录"
android:textColor="@color/white"
android:textSize="@dimen/titleTextSize"
android:textStyle="bold"/>
</android.support.v7.widget.Toolbar>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:fillViewport="true">
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bgcolor"
android:orientation="vertical">
<ListView
android:id="@+id/consult_talk_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/consult_talk_list_bottom_lay"
android:layout_alignParentTop="true"
android:divider="@null"
android:overScrollMode="never"
android:scrollbars="none"
android:transcriptMode="normal"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_below="@+id/consult_talk_list"
android:background="@color/black"/>
<LinearLayout
android:id="@+id/consult_talk_list_bottom_lay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical">
<LinearLayout
android:id="@+id/consult_talk_list_lay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#eee"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingBottom="6dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="6dp"
android:visibility="gone">
<ImageView
android:id="@+id/consult_talk_list_item_voice"
android:layout_width="32dp"
android:layout_height="32dp"
android:clickable="true"
android:src="@drawable/voice_icon"/>
<ImageView
android:id="@+id/bar_image_add_btn"
android:layout_width="28dp"
android:layout_height="28dp"
android:clickable="true"
android:scaleType="centerCrop"
android:src="@drawable/ic_plus"
android:visibility="gone"/>
<LinearLayout
android:id="@+id/rl_editbar_bg"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_weight="1"
android:background="@drawable/shape_bg_reply_edittext"
android:gravity="center_vertical"
android:orientation="horizontal">
<EditText
android:id="@+id/consult_talk_list_item_edit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#0000"
android:maxLines="3"
android:minHeight="36dp"
android:textColor="@color/text_color"
android:textSize="16sp"/>
</LinearLayout>
<Button
android:id="@+id/consult_talk_list_item_send"
android:layout_width="56dp"
android:layout_height="32dp"
android:background="@drawable/shape_bg_button_reply"
android:text="发送"
android:textColor="@color/white"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#eee"
android:gravity="center"
android:orientation="horizontal"
android:paddingBottom="6dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="6dp">
<TextView
android:id="@+id/consult_talk_list_item_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:background="@drawable/good_button_back"
android:gravity="center"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="点击评价"
android:textColor="@color/text_color"
android:textSize="18sp"
android:visibility="gone"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</ScrollView>
</LinearLayout>
这个时候只也不需要设置成adjustPan了,只设置成stateHidden就行了,默认隐藏软键盘。当输入框获取到焦点的时候,聊天记录的ListView就会上滑而不影响标题栏。当然如果记录较多的时候我们想让每次获取焦点的时候记录都处于最下方,即ListView每次都滚到最底部,这样就可以看到最新的消息,我们可以监听软键盘的弹出和隐藏事件来完成。
EditText.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//获取当前界面可视部分的四个坐标
GridReflyActivity.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
//获取屏幕的高度
int screenHeight = GridReflyActivity.this.getWindow().getDecorView().getRootView().getHeight();
//ScreenHeight是屏幕高度,稳定不变的,但是应用的可视区域r会变,如果软键盘弹出,那么r.bottom就会变小
int heightDifference = screenHeight - r.bottom;
if (heightDifference > 0) {
doSomeThing();
} else {
doSomeThing()
}
}
}
heightDifference > 0时,我们可以设置弹出事件,heightDifference < 0时,我们可以设置隐藏的事件。
现在很多App的登陆页面中点击登陆框隐藏logo的效果也可以通过这个完成。