图1 启动界面 图2 未监听键盘弹起 图3 监听键盘弹起
如图app的登录界面输入账号密码的时候,让登录按钮露出来可以方便用户操作。所以有必要监听键盘弹出收起。
需要了解:
Activity的android:windowSoftInputMode属性
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
搜到的一些监听键盘的方法必须要windowSoftInputMode属性为adjustResize时才可以用。这个方法不适用与app全屏显示(全屏时布局大小并不会改变)。这个方法主要是实现OnLayoutChangeListener接口。
最终在csdn找到一个类,可以实现监听键盘弹出收起,不用考虑windowSoftInputMode属性与Activity是否全屏。
softkeyboardlistener类:
package com.ljh.softkeyboardlistener;
import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.Toast;
/**
* Created by liujinhua on 15/10/25.
*/
public class SoftKeyBoardListener {
private View rootView;//activity的根视图
int rootViewVisibleHeight;//纪录根视图的显示高度
private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;
public SoftKeyBoardListener(Activity activity) {
//获取activity的根视图
rootView = activity.getWindow().getDecorView();
//监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//获取当前根视图在屏幕上显示的大小
Rect r = new Rect();
rootView.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) {
if (onSoftKeyBoardChangeListener != null) {
onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);
}
rootViewVisibleHeight = visibleHeight;
return;
}
//根视图显示高度变大超过200,可以看作软键盘隐藏了
if (visibleHeight - rootViewVisibleHeight > 200) {
if (onSoftKeyBoardChangeListener != null) {
onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);
}
rootViewVisibleHeight = visibleHeight;
return;
}
}
});
}
private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
}
public interface OnSoftKeyBoardChangeListener {
void keyBoardShow(int height);
void keyBoardHide(int height);
}
public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);
}
}
Activity中调用:
SoftKeyBoardListener.setListener(AdjustResizeActivity.this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
@Override
public void keyBoardShow(int height) {
Toast.makeText(AdjustResizeActivity.this, "键盘显示 高度" + height, Toast.LENGTH_SHORT).show();
}
@Override
public void keyBoardHide(int height) {
Toast.makeText(AdjustResizeActivity.this, "键盘隐藏 高度" + height, Toast.LENGTH_SHORT).show();
}
});
这样就可以监听键盘的弹出收起操作了。可以在keyBoardShow与keyBoardHide函数中写入对布局的操作。
图中的效果是把最上面的TextView的Height变小,使登录按钮露出。
具体使用:
1。添加自定义SoftKeyBoardListener工具类。
2。在要使用的Activity里声明:
private SoftKeyBoardListener softKeyBoardListener ;
3。在Activity的onCreate()里new然后注册监听重写方法:
softKeyBoardListener = new SoftKeyBoardListener(CitySearchActivity.this);
softKeyBoardListener.setListener(CitySearchActivity.this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener()
{
@Override
public void keyBoardShow(int height) {
Log.e("keyboard", "show");
}
@Override
public void keyBoardHide(int height) {
Log.e("keyboard", "hide");
edit_text.clearFocus();
}
});
}
转自 https://blog.csdn.net/u011181222/article/details/52043001