android 键盘弹出 监听,奇技淫巧之-Android监听键盘弹出与隐藏事件

ff1d8bcc5253

CaptainAndroid.png

相信看到这个标题,大家都会潜意识觉得:Activity中没有可以复写的方法么?或者说,没有什么listener可以让我们使用么?

抱歉,真的没有,我们潜意识都是以为系统会提供,其实系统提供的是InputMethodManager,让我们控制键盘的弹出和隐藏,而不是键盘弹出和隐藏触发事件。

我们在开发中经常会遇到软键盘遮挡住了输入框,而直接把输入框往上顶adjustResize这种方法过于暴力影响美观,我们希望键盘弹出时动态的去改变布局。这时候,便用到了监听键盘弹起事件的功能。

正题

好了,进入正题,如何监听键盘的弹出和隐藏呢?

目前通用的方法是,由于键盘弹起与隐藏,会使得layout的布局发生变化,通过布局的大小变化触发的事件实现键盘事件的触发(该方法的缺点是,当设置为全屏模式时,由于布局强制充满全屏,此时布局大小不会再改变,该方法也就失效了。至少我这边是这样的 ->_-> )

我们可以复写一个ViewGroup的onSizeChanged方法,然后我们的根布局就是这个AdjustSizeLinearLayout,此时当键盘弹起会触发我们的监听器。

import android.content.Context;

import android.util.AttributeSet;

import android.util.Log;

import android.widget.LinearLayout;

public class AdjustSizeLinearLayout extends LinearLayout{

public AdjustSizeLinearLayout(Context context) {

super(context);

}

public AdjustSizeLinearLayout(Context context, AttributeSet attrs,

int defStyle) {

super(context, attrs, defStyle);

}

public AdjustSizeLinearLayout(Context context, AttributeSet attrs) {

super(context, attrs);

}

private int mChangeSize = 200;

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

Log.e("###xiamin", "change" + w + " " + h + " " + oldw + " " + oldh);

if (oldw == 0 || oldh == 0)

return;

if (boardListener != null) {

if (oldw != 0 && h - oldh < -mChangeSize) {

Log.e("###xiamin","键盘弹出"+ "change" + w + " " + h + " " + oldw + " " + oldh);

ToastUtils.showToast(getContext(), "键盘弹出");

boardListener.keyBoardVisable(Math.abs(h - oldh));

}

if (oldw != 0 && h - oldh > mChangeSize) {

ToastUtils.showToast(getContext(), "键盘下去");

Log.e("###xiamin","键盘结束"+ "change" + w + " " + h + " " + oldw + " " + oldh);

boardListener.keyBoardInvisable(Math.abs(h - oldh));

}

}

}

public interface SoftkeyBoardListener {

public void keyBoardVisable(int move);

public void keyBoardInvisable(int move);

}

SoftkeyBoardListener boardListener;

public void setSoftKeyBoardListener(SoftkeyBoardListener boardListener) {

this.boardListener = boardListener;

}

}

该方法来自于github,

使用简单

make activity:

android:windowSoftInputMode="adjustResize"

java:

new KeyboardChangeListener(this).setKeyBoardListener(new KeyboardChangeListener.KeyBoardListener() {

@Override

public void onKeyboardChange(boolean isShow, int keyboardHeight) {

Log.d(TAG, "isShow = [" + isShow + "], keyboardHeight = [" + keyboardHeight + "]");

}

});

虽然不是根据布局大小变化来判断的,但是根据ViewTreeObserver.OnGlobalLayoutListener,

@Override

public void onGlobalLayout() {

int currHeight = mContentView.getHeight();

if (currHeight == 0) {

Log.i(TAG, "currHeight is 0");

return;

}

boolean hasChange = false;

if (mPreHeight == 0) {

mPreHeight = currHeight;

mOriginHeight = currHeight;

} else {

if (mPreHeight != currHeight) {

hasChange = true;

mPreHeight = currHeight;

} else {

hasChange = false;

}

}

if (hasChange) {

boolean isShow;

int keyboardHeight = 0;

if (mOriginHeight == currHeight) {

//hidden

isShow = false;

} else {

//show

keyboardHeight = mOriginHeight - currHeight;

isShow = true;

}

if (mKeyBoardListen != null) {

mKeyBoardListen.onKeyboardChange(isShow, keyboardHeight);

}

}

}

还是根据高度变化来间接判断键盘是否弹出的。

总结

Android系统并没有给我们提供监听键盘弹出的方法,我们只能自己监听view的高度变化来间接判断键盘是不是弹出了。同时希望大家有更好的方法提供

谢谢大家阅读,如有帮助,来个喜欢或者关注吧!

本文作者:Anderson/Jerey_Jobs

Python作为一种高级编程语言,有许多巧妙的设计和特性,被誉为“一种你会喜欢上的语言”(There's a lot you can do with just a few lines of code)。以下是几个Python的独特之处和一些常见的奇技淫巧: 1. **列表推导式 (List Comprehension)**:这是一种简洁的方式来创建新的列表,通常用于数据转换或过滤。例如 `new_list = [x * x for x in range(5)]` 创建了一个包含0到4的平方数的新列表。 2. **生成器 (Generators)**:生成器是惰性求值的序列,它们按需计算值,节省内存。比如 `gen = (x*x for x in range(10))` 可以逐个生成0到9的平方。 3. **装饰器 (Decorators)**:Python允许在运行时修改函数或类的行为,通过定义接收其他函数作为输入并返回新函数的函数,如 `@staticmethod` 和 `@classmethod`。 4. **鸭子类型 (Duck Typing)**:Python并不关心类型的严格匹配,只要对象有需要的方法就认为它是可以的,这使得代码更具灵活性。 5. **元组解包 (Tuple Unpacking)**:可以用变量名直接接收元组或列表的元素,如 `(a, b) = ('Hello', 'World')`。 6. **魔法方法 (Magic Methods)**:特殊的双下划线开头和结尾的方法(如 `__init__`、`__str__`),用于实现自定义操作,如实例化、比较和显示。 7. **异常处理 (Exception Handling)**:Python的try-except-finally结构可以优雅地处理错误,提供了一种控制程序流程的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值