Android监听键盘弹出收起并移动界面
2019-03-26 本文已影响57人
景山道人
Android 监听键盘弹出收起 - 掘金
代码中所用的监听键盘部分来自这里
目的:不使用AdjustPan达到AdjustPan的功能,用这个的话设置AdjustResize就好了,这种方法也可以自己修改键盘抬升的距离,相比系统默认顶到EditText底下会好一点吧。
用法:new, add
方法:计算EditText底部和当前更改后的Windows底部的差值,抬升这个差值就好了,应该不用考虑状态栏高度的问题
问题:解决不了View捅进透明状态栏的问题,以及谁知道在什么手机上会不会冒出来些奇怪的问题
解决方案:更新后可以自己传自己希望的contentView进去,不是最外层布局的话应该不会捅进透明状态栏里面去。
其他:这个不用时记得删,不然会造成没必要的空间和时间损耗。
这个监听调用次数特别频繁,所以不用时一定要remove掉。
实际上因为这个会持有一个View的对象,可能还有别的更好的写法,本菜鸡设计模式比较菜emm,等哪天把设计模式翻一遍,有机会还会再更新
更新:
换了点内容,原来的类我还留着,放底下了。
新的这个我换了个构造函数,现在可以直接传contentView进来,然后EditText是通过获取Activity再获取焦点的方式得到的,另外新增了一个键盘弹出时调用的Listener还有添加offset的接口
import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.EditText;
public class KeyboardChangeHelper implements ViewTreeObserver.OnGlobalLayoutListener {
private View contentView;
private EditText targetView;
private int rootViewVisibleHeight = 0;
private int offset;
private OnKeyboardShowListener listener;
public KeyboardChangeHelper(View contentView) {
this.contentView = contentView;
setTranslationOffset(0);
}
@Override
public void onGlobalLayout() {
if (!initTargetView()) {
return;
}
Rect r = new Rect();
contentView.getWindowVisibleDisplayFrame(r);
int visibleHeight = r.height();
if (rootViewVisibleHeight == 0) {
rootViewVisibleHeight = visibleHeight;
return;
}
//根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
if (rootViewVisibleHeight == visibleHeight) {
return;
}
//根视图显示高度变小超过200,可以看作软键盘显示了
if (rootViewVisibleHeight - visibleHeight > 200) {
rootViewVisibleHeight = visibleHeight;
if (null != listener) {
listener.onKeyboardShow();
}
layoutResize(true, r.bottom);
return;
}
//根视图显示高度变大超过200,可以看作软键盘隐藏了
if (visibleHeight - rootViewVisibleHeight > 200) {
rootViewVisibleHeight = visibleHeight;
if (null != listener) {
listener.onKeyboardHide();
}
layoutResize(false, 0);
}
}
private void layoutResize(boolean isKeyboardShow, int currentBottom) {
int resizeHeight = 0;
Rect rect = new Rect();
if (null != targetView) {
targetView.getGlobalVisibleRect(rect);
// rect.bottom 获取到的时EditText的底部,加上offset是再往下offset距离的底部
resizeHeight = rect.bottom + offset - currentBottom;
}
if (resizeHeight < 0) {
return;
}
if (isKeyboardShow) {
contentView.setTranslationY(-resizeHeight);
} else {
contentView.setTranslationY(0);
}
}
private boolean initTargetView() {
View focusedView;
Activity activity = (Activity) contentView.getContext();
if (null != activity) {
focusedView = activity.getCurrentFocus();
} else {
return false;
}
if (focusedView instanceof EditText) {
targetView = (EditText)focusedView;
}
return true;
}
public void addListener() {
contentView.getViewTreeObserver().addOnGlobalLayoutListener(this);
}
public void removeListener() {
// remember to remove if used
contentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
public void setTranslationOffset(int offset) {
this.offset = offset;
}
public void addOnKeyboardShowListener(OnKeyboardShowListener listener) {
this.listener = listener;
}
public interface OnKeyboardShowListener {
void onKeyboardShow();
void onKeyboardHide();
}
}
下面是原来的:
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.EditText;
public class KeyboardChangeHelper implements ViewTreeObserver.OnGlobalLayoutListener {
private View contentView;
private EditText targetView;
private int rootViewVisibleHeight = 0;
public KeyboardChangeHelper(EditText targetView) {
this.contentView = targetView.getRootView();
this.targetView = targetView;
}
@Override
public void onGlobalLayout() {
Rect r = new Rect();
contentView.getWindowVisibleDisplayFrame(r);
int visibleHeight = r.height();
System.out.println(""+visibleHeight);
if (rootViewVisibleHeight == 0) {
rootViewVisibleHeight = visibleHeight;
return;
}
//根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
if (rootViewVisibleHeight == visibleHeight) {
return;
}
//根视图显示高度变小超过200,可以看作软键盘显示了
if (rootViewVisibleHeight - visibleHeight > 200) {
rootViewVisibleHeight = visibleHeight;
layoutResize(true, r.bottom);
return;
}
//根视图显示高度变大超过200,可以看作软键盘隐藏了
if (visibleHeight - rootViewVisibleHeight > 200) {
rootViewVisibleHeight = visibleHeight;
layoutResize(false, 0);
}
}
private void layoutResize(boolean isKeyboardShow, int currentBottom) {
int resizeHeight = 0;
Rect rect = new Rect();
if (null != targetView) {
targetView.getGlobalVisibleRect(rect);
resizeHeight = rect.bottom - currentBottom;
}
if (resizeHeight < 0) {
return;
}
if (isKeyboardShow) {
contentView.setTranslationY(-resizeHeight);
} else {
contentView.setTranslationY(0);
}
}
public void addListener() {
contentView.getViewTreeObserver().addOnGlobalLayoutListener(this);
}
public void removeListener() {
// remember to remove if used
contentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
有爱自取,毕竟搞这个本身没什么技术含量,(有技术含量我也搞不出来)