最近在公司开发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.点击软键盘自带的收起按钮(软键盘收起)
问题卡在此处,经过资料的搜查,还是么能找到软键盘收起按钮事件监听的办法,最后在stackoverflow网站找到了从布局高度的变化来判断软键盘的打开和收起事件。
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(); } } } }
代码的使用:
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://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android
从中选取了这段代码。
这样能一并解决以上4种情况,比较好的监听软键盘的打开和收起事件,目前正在使用中。
原文地址: http://blog.csdn.net/xcookies/article/details/43024911