关于Android软键盘弹出的问题

在开发中,我们经常会用到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的效果也可以通过这个完成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值