最近在公司开发cocos2dx上的Android输入框控件,遇到软键盘的事件监听,通常软键盘的收起方式大致3种:
1.点击软键盘右下角的Return按钮(系统收起)
2.输入框焦点时按返回按钮(系统收起)
3.点击软键盘和输入框的外部(自发收起)
4.点击软键盘自带的收起按钮(软键盘收起)
前三种事件可以监听,方式都比较简单
1.点击软键盘右下角的Return按钮
给输入框设置监听
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event) {
// 可捕捉右下角的Return按钮
//添加抛出收起事件代码
return false;
}
});
2.输入框焦点时按返回按钮
给输入框增加按钮监听
editText.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (listener != null) {
// 可添加抛出收起事件代码
}
return true;
}
return false;
}
});
3.点击软键盘和输入框的外部
给输入框的父容器增加触摸监听
@Override
public boolean onTouchEvent(MotionEvent event) {
if (indexOfChild(editText) > -1) {
// 可添加抛出收起事件代码
}
return super.onTouchEvent(event);
}
4.点击软键盘自带的收起按钮(软键盘收起)
问题卡在此处,经过资料的搜查,还是么能找到软键盘收起按钮事件监听的办法,最后在*网站找到了从布局高度的变化来判断软键盘的打开和收起事件。
[java] view plain copy
- import android.graphics.Rect;
- import android.view.View;
- import android.view.ViewTreeObserver;
-
- import java.util.LinkedList;
- import java.util.List;
-
- public class SoftKeyboardStateHelper implements ViewTreeObserver.OnGlobalLayoutListener {
-
- public interface SoftKeyboardStateListener {
- void onSoftKeyboardOpened(int keyboardHeightInPx);
- void onSoftKeyboardClosed();
- }
-
- private final List<SoftKeyboardStateListener> listeners = new LinkedList<SoftKeyboardStateListener>();
- private final View activityRootView;
- private int lastSoftKeyboardHeightInPx;
- private boolean isSoftKeyboardOpened;
-
- public SoftKeyboardStateHelper(View activityRootView) {
- this(activityRootView, false);
- }
-
- public SoftKeyboardStateHelper(View activityRootView, boolean isSoftKeyboardOpened) {
- this.activityRootView = activityRootView;
- this.isSoftKeyboardOpened = isSoftKeyboardOpened;
- activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
- }
-
- @Override
- public void onGlobalLayout() {
- final Rect r = new Rect();
-
- activityRootView.getWindowVisibleDisplayFrame(r);
-
- final int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
- if (!isSoftKeyboardOpened && heightDiff > 100) {
- isSoftKeyboardOpened = true;
- notifyOnSoftKeyboardOpened(heightDiff);
- } else if (isSoftKeyboardOpened && heightDiff < 100) {
- isSoftKeyboardOpened = false;
- notifyOnSoftKeyboardClosed();
- }
- }
-
- public void setIsSoftKeyboardOpened(boolean isSoftKeyboardOpened) {
- this.isSoftKeyboardOpened = isSoftKeyboardOpened;
- }
-
- public boolean isSoftKeyboardOpened() {
- return isSoftKeyboardOpened;
- }
-
-
-
-
-
- public int getLastSoftKeyboardHeightInPx() {
- return lastSoftKeyboardHeightInPx;
- }
-
- public void addSoftKeyboardStateListener(SoftKeyboardStateListener listener) {
- listeners.add(listener);
- }
-
- public void removeSoftKeyboardStateListener(SoftKeyboardStateListener listener) {
- listeners.remove(listener);
- }
-
- private void notifyOnSoftKeyboardOpened(int keyboardHeightInPx) {
- this.lastSoftKeyboardHeightInPx = keyboardHeightInPx;
-
- for (SoftKeyboardStateListener listener : listeners) {
- if (listener != null) {
- listener.onSoftKeyboardOpened(keyboardHeightInPx);
- }
- }
- }
-
- private void notifyOnSoftKeyboardClosed() {
- for (SoftKeyboardStateListener listener : listeners) {
- if (listener != null) {
- listener.onSoftKeyboardClosed();
- }
- }
- }
- }
代码的使用:
[java] view plain copy
- final SoftKeyboardStateHelper softKeyboardStateHelper = new SoftKeyboardStateHelper(findViewById(R.id.activity_main_layout);
- softKeyboardStateHelper.addSoftKeyboardStateListener(...);
-
SoftKeyboardStateHelper softKeyboardStateHelper = new SoftKeyboardStateHelper(findViewById(R.id.activity_main_layout));
softKeyboardStateHelper.addSoftKeyboardStateListener(new SoftKeyboardStateHelper.SoftKeyboardStateListener() {
@Override
public void onSoftKeyboardOpened(int keyboardHeightInPx) {
//键盘打开
}
@Override
public void onSoftKeyboardClosed() {
//键盘关闭
}
});
地址链接:http://*.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android
从中选取了这段代码。
这样能一并解决以上4种情况,比较好的监听软键盘的打开和收起事件,目前正在使用中。
原文地址: http://blog.csdn.net/xcookies/article/details/43024911