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();    
        //r will be populated with the coordinates of your view that area still visible.    
        activityRootView.getWindowVisibleDisplayFrame(r);    

        final int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);    
        if (!isSoftKeyboardOpened && heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...    
            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;    
    }    

    /**  
     * Default value is zero (0)  
     * @return last saved keyboard height in px  
     */    
    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(...)  

这样能一并解决以上4种情况,比较好的监听软键盘的打开和收起事件,目前正在使用中。

原文 :监听软键盘打开收起事件(软键盘自带收起按钮)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值