Andorid解决登陆时edittext软键盘遮挡问题

KeyboardLayout监听输入法是否弹出(大于屏幕高度的五分之一)
效果图:
这里写图片描述

package com.jiongbook.evaluation.utils;

import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.FrameLayout;

/**
 * 作者:haoran   on https://github.com/woaigmz 2017/9/19.
 * 邮箱:1549112908@qq.com
 * 说明:
 */

public class KeyboardLayout  extends FrameLayout {

    private KeyboardLayoutListener mListener;
    private boolean mIsKeyboardActive = false; //输入法是否激活
    private int mKeyboardHeight = 0; // 输入法高度

    public KeyboardLayout(Context context) {
        this(context, null, 0);
    }

    public KeyboardLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public KeyboardLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // 监听布局变化
        getViewTreeObserver().addOnGlobalLayoutListener(new KeyboardOnGlobalChangeListener());
    }

    public void setKeyboardListener(KeyboardLayoutListener listener) {
        mListener = listener;
    }

    public KeyboardLayoutListener getKeyboardListener() {
        return mListener;
    }

    public boolean isKeyboardActive() {
        return mIsKeyboardActive;
    }

    /**
     * 获取输入法高度
     *
     * @return
     */
    public int getKeyboardHeight() {
        return mKeyboardHeight;
    }

    public interface KeyboardLayoutListener {
        /**
         * @param isActive       输入法是否激活
         * @param keyboardHeight 输入法面板高度
         */
        void onKeyboardStateChanged(boolean isActive, int keyboardHeight);
    }

    private class KeyboardOnGlobalChangeListener implements ViewTreeObserver.OnGlobalLayoutListener {

        int mScreenHeight = 0;

        private int getScreenHeight() {
            if (mScreenHeight > 0) {
                return mScreenHeight;
            }
            mScreenHeight = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
                    .getDefaultDisplay().getHeight();
            return mScreenHeight;
        }

        @Override
        public void onGlobalLayout() {
            Rect rect = new Rect();
            // 获取当前页面窗口的显示范围
            ((Activity) getContext()).getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
            int screenHeight = getScreenHeight();
            int keyboardHeight = screenHeight - rect.bottom; // 输入法的高度
            boolean isActive = false;
            if (Math.abs(keyboardHeight) > screenHeight / 4) {
                isActive = true; // 超过屏幕五分之一则表示弹出了输入法
                mKeyboardHeight = keyboardHeight;
            }
            mIsKeyboardActive = isActive;
            if (mListener != null) {
                mListener.onKeyboardStateChanged(isActive, keyboardHeight);
            }
        }
    }

}

使用:

布局里:KeyboardLayout + ScrollView

<?xml version="1.0" encoding="utf-8"?>
<com.jiongbook.evaluation.utils.KeyboardLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_ll"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ScrollView
        android:id="@+id/sl"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <RelativeLayout
            android:id="@+id/rl_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <android.support.constraint.ConstraintLayout
                android:id="@+id/cl"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <ImageView
                    android:id="@+id/iv_line_phone_number"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="27dp"
                    android:layout_marginStart="27dp"
                    android:layout_marginTop="112dp"
                    android:src="@drawable/line_phone_number"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toTopOf="parent"/>
                <ImageView
                    android:id="@+id/iv_line_password"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="27dp"
                    android:layout_marginStart="27dp"
                    android:layout_marginTop="179dp"
                    android:src="@drawable/line_password"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toTopOf="parent"/>

                <ImageView
                    android:id="@+id/iv_line_verify"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="27dp"
                    android:layout_marginStart="27dp"
                    android:layout_marginTop="245dp"
                    android:src="@drawable/line2"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toTopOf="parent"/>
                <EditText
                    android:inputType="phone"
                    android:background="@null"
                    android:id="@+id/et_phone_number"
                    android:layout_width="200dp"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="18dp"
                    android:layout_marginLeft="23dp"
                    android:layout_marginStart="23dp"
                    android:letterSpacing="0.05"
                    android:hint="手机号"
                    android:textColorHint="@color/black"
                    android:textSize="16sp"
                    app:layout_constraintBottom_toBottomOf="@+id/iv_line_phone_number"
                    app:layout_constraintLeft_toLeftOf="@+id/iv_line_phone_number"/>
                <EditText
                    android:background="@null"
                    android:id="@+id/et_password"
                    android:layout_width="200dp"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="18dp"
                    android:layout_marginLeft="23dp"
                    android:layout_marginStart="23dp"
                    android:hint="密码  "
                    android:textColorHint="@color/black"
                    android:textSize="16sp"
                    app:layout_constraintBottom_toBottomOf="@+id/iv_line_password"
                    app:layout_constraintLeft_toLeftOf="@+id/iv_line_password"/>
                <EditText
                    android:background="@null"
                    android:id="@+id/et_verify"
                    android:layout_width="53dp"
                    android:layout_height="25dp"
                    android:layout_marginBottom="18dp"
                    android:layout_marginLeft="23dp"
                    android:layout_marginStart="23dp"
                    android:hint="验证码"
                    android:textColorHint="@color/black"
                    android:textSize="16sp"
                    app:layout_constraintBottom_toBottomOf="@+id/iv_line_verify"
                    app:layout_constraintLeft_toLeftOf="@+id/iv_line_verify"/>
                <ImageView
                    android:id="@+id/iv_verify"
                    android:src="@drawable/button_copy_8"
                    android:scaleType="centerCrop"
                    android:layout_marginLeft="17dp"
                    app:layout_constraintBottom_toBottomOf="@+id/iv_line_verify"
                    app:layout_constraintLeft_toRightOf="@+id/iv_line_verify"
                    android:layout_width="110dp"
                    android:layout_height="40dp"/>
            </android.support.constraint.ConstraintLayout>
            <LinearLayout
                android:layout_centerHorizontal="true"
                android:layout_below="@id/cl"
                android:orientation="vertical"
                android:layout_marginTop="40dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
                <ImageView
                    android:id="@+id/iv_login"
                    android:src="@drawable/button_login"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
                    <TextView


                        android:id="@+id/tv_register"
                        android:layout_marginTop="21dp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="14sp"
                        android:textColor="#81a8c7"
                        android:text="新用户注册"/>
                    <TextView

                        android:id="@+id/tv_forgot_password"
                        android:layout_alignParentRight="true"
                        android:layout_marginTop="21dp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="14sp"
                        android:textColor="#81a8c7"
                        android:text="忘记密码"/>
                </RelativeLayout>
            </LinearLayout>
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/dark_grey_blue">
                <ImageView
                    android:id="@+id/iv_hey"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="36dp"
                    android:layout_marginStart="36dp"
                    android:layout_marginTop="131dp"
                    android:scaleType="centerCrop"
                    android:src="@drawable/hey"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toTopOf="parent"/>

                <ImageView
                    android:layout_below="@id/iv_hey"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="36dp"
                    android:layout_marginStart="36dp"
                    android:layout_marginBottom="35dp"
                    android:src="@drawable/it_s_been_so_long"
                    />
                <ImageView
                    android:id="@+id/iv_close"
                    android:layout_marginTop="12dp"
                    android:layout_marginRight="12dp"
                    android:layout_alignParentRight="true"
                    android:src="@drawable/close"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:layout_marginEnd="12dp"/>
            </RelativeLayout>
        </RelativeLayout>
    </ScrollView>

</com.jiongbook.evaluation.utils.KeyboardLayout>

Activity里:onCreate里添加监听addLayoutListener();

public void addLayoutListener() {
        main_ll.setKeyboardListener((isActive, keyboardHeight) -> {
            if (isActive) {
                scrollToBottom();
            }
        });
    }

    /**
     * 弹出软键盘时将SVContainer滑到底
     */
    private void scrollToBottom() {
        sl.postDelayed(() -> sl.smoothScrollTo(0, sl.getBottom() + SoftKeyInputHidWidget.getStatusBarHeight(LoginActivity.this)), 100);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值