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);
}