最近项目里面要用到键盘,并且要控制键盘的关闭和弹起。在网上查了好多资料和事件,总结下一共有以下几种方法。
1:在activity 中添加 以下代码
OnGlobalLayoutListener 注册后 onGlobalLayout 方法会一直执行,处理完自己的逻辑后血要remove
finalView activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
if(heightDiff > dpToPx(this,200)) {// 显示软键盘}else{//隐藏软键盘}
}
});
2:第二种 也是我现在才用的方法
自定义 最外层的 View ,然后重写 onSizeChanged(int w, int h, int oldw, int oldh)方法。
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w,h,oldw,oldh);
if(listener!=null){
if(oldh > h) {
listener.show();
}else{
listener.hidden();
}
}
}
3:第三种方法 自定义 EditText
public class MyEditText extends EditText {
public MyEditText(Context context) {
super(context);
}
private OnFinishComposingListener mFinishComposingListener;
public void setOnFinishComposingListener(OnFinishComposingListener listener) {
this.mFinishComposingListener = listener;
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return newMyInputConnection(super.onCreateInputConnection(outAttrs),false);
}
public class MyInputConnection extends InputConnectionWrapper {
public MyInputConnection(InputConnection target,booleanmutable) {
super(target, mutable);
}
@Override
public boolean finishComposingText() {
boolean finishComposing =super.finishComposingText();
if(mFinishComposingListener !=null) {
mFinishComposingListener.finishComposing();
}
returnfinishComposing;
}
}
public interface OnFinishComposingListener {
public void finishComposing();
}
}
第三种 个人觉得最好用,但是他有个问题就是 在个别三星机器上会弹不出键盘。
以上就是自己项目用到总结的。希望遇到这种问题的同学,可以绕过这个坑。。