Android应用开发之Android 键盘操作常见问题
白羽 2018-12-19 来源 :网络 阅读 244 评论 0

摘要:本文将带你了解Android应用开发Android 键盘操作常见问题,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android 键盘操作常见问题,希望本文对大家学Android有所帮助。


   

Android 键盘操作常见问题

Android 键盘相关常见问题有:


   

1. 限制输入框内字数,超过字数不让输入,并且提示

2. 点击外部区域键盘自动收起 

3. 如何获取键盘高度 

   

下面将对上述问题各个击破。

1.限制输入框内字数,超过字数不让输入,并且提示


   

etReply.setFilters(new InputFilter[]{new InputFilter(){

 @Override

 public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

  if (source.length() + dest.length() > COMMENT_MAX_NUM) {

Crouton.makeText(AppUtils.getString(R.string.infodetail_comment_limit),Style.ALERT).show(); 

  }

  return null;

 } 

}, new InputFilter.LengthFilter(COMMENT_MAX_NUM)});

   

2. 点击外部区域键盘自动收起

如果当前页面是Activity那么可以直接重写dispatchTouchEvent方法。在ACTION_DOWN事件时,判断点击的坐标是否在输入框坐标的上面,如果是那么调用隐藏键盘的方法。
如果当前页面是Fragment,那么Fragment中增加一个dispatchTouchEvent方法,内部逻辑同上,在Fragment所依赖的Activity代码中将dispatchTouchEvent事件透传给Fragment的dispatchTouchEvent,如果键盘需要隐藏,Fragment的dispatchTouchEvent方法需要返回true,表示消费本次所有触摸事件,不再继续传递。

3. 如何获取键盘高度

首先需要知道一点,键盘高度不是固定的。用户使用不同的输入法,高度可能不一样;甚至有些输入法,可以直接调节输入法面板的高度。

<h3 id="31-有没有系统的api可以供我们获取键盘高度">3.1 有没有系统的api可以供我们获取键盘高度?

没有。

3.2 有什么方法可以间接获取键盘高度?

系统给我们提供了一个页面布局变化的监听器OnGlobalLayoutListener,这个监听器可以通知我们布局发生改变,我们可以在此时获取自己的高度,再通过屏幕宽度和状态栏高度等间接计算出键盘的高度。

那么就有一个问题,OnGlobalLayoutListener接收到变化动作时,一定是键盘弹出或消失么?

不一定。

那为什么使用OnGlobalLayoutListener可以监听键盘的状态?

我们知道每个view的宽高变化都会导致OnGlobalLayoutListener的触发,但是对当前Activity的Window对象中的DecorView进行监听时,一般来说,DecorView的尺寸不会发生变化,发生变化的主要原因就是键盘的收起和展开,这时候加上简单的判断(变化超过某个阈值)就可以获取键盘的高度,以及是否弹起。

有没有使用OnGlobalLayoutListener监听键盘失效的情景?
在Android7.0上,我们可以使用多任务键开启分屏/多窗口模式,当我们开启分屏之后,调整分屏的分界线时,都会触发DecorView的OnGlobalLayoutListener,但是此时键盘并未触发任何动作;而且,当我们点击某个输入框之后,键盘在分屏模式下会变成悬浮模式,不会挤压Activity的控件,所以当键盘弹出或收起时,OnGlobalLayoutListener不会接收到任何事件。这就导致了OnGlobalLayoutListener完全失效。

3.3 获取键盘高度

在一般情况下,我们对Activity的PhoneWindow中DecorView的布局变化进行监听,一般来说,变化值超过60dp就可以认为是键盘弹出或收起了。而且在非全屏主题下,
键盘高度 = 屏幕高度 - 状态栏高度 - 主视图高度 - 标题栏高度, 于是我们可以通过下面代码间接计算出键盘高度。



   

mDecorView = this.getActivity().getWindow().getDecorView();

mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { 

 @Override

 public void onGlobalLayout() {

  Rect rect = new Rect();

  mDecorView.getWindowVisibleDisplayFrame(rect); 

  int displayHeight = rect.bottom; 

  if (Math.abs(displayHeight - mOldDecorViewHeight) > dp60) {

mOldDecorViewHeight =displayHeight; 

int rootHeight = mRoot.getHeight(); 

int statusBarHeight = getStatusBarHeight(); 

int screenHeight = getScreenHeight();

int titleBarHeight = getTitleBarHeight(); 

int keyboardHeight = screenHeight - statusBarHeight -rootHeight - titleBarHeight; 

Log.i("lxc", "keyboardHeight ---> " + keyboardHeight + " 键盘: " + (keyboardHeight > 0 ? "弹出" : "收起")); 

  } 

 } 

};

mDecorView.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);

   

          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程