系统本身没有提供获取虚拟键盘的方法,在网上查了一些资料,发现还存在一点问题,故此把改好的代码记录下来,以备后用。

需要用OnGlobalLayoutListener来监听app窗口的变化

final View decorView = getActivity().getWindow().getDecorView();//虚拟按键高度final int vmKeyHeight = getActivity().getResources().getDimensionPixelSize(getResources().getIdentifier("navigation_bar_height", "dimen", "android"));decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {Rect rect = new Rect();decorView.getWindowVisibleDisplayFrame(rect);int displayHeight = rect.bottom - rect.top;//可见屏幕的高度,不包括顶部状态栏和底部虚拟按键int keyboardHeight = decorView.getHeight() - displayHeight - rect.top;//这里要减去顶部状态栏高度,否则会不准,看网上的文章大都没减去状态栏高度if(isVmKeyShow())//如果显示虚拟按键,则还要减去虚拟按键的高度keyboardHeight-=vmKeyHeight;//这个就是最终虚拟键盘的高度,后面是数据的使用}}});
private boolean isVmKeyShow() {//这个方法在三星手机上测试不好用Display display = getActivity().getWindowManager().getDefaultDisplay();Point size=new Point();Point realSize=new Point();display.getSize(size);display.getRealSize(realSize);return size.y!=realSize.y;}


上面判断虚拟按键的方式在三星手机上测试不好用,故此改了整体代码,目的是切换输入法及虚拟按键,保持输入框位置不变,如下
final View decorView = getActivity().getWindow().getDecorView();//获取虚拟按键高度int id = getResources().getIdentifier("navigation_bar_height", "dimen", "android");final int vmKeyHeight =id==0? 0: getActivity().getResources().getDimensionPixelSize(id);decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {Rect rect = new Rect();decorView.getWindowVisibleDisplayFrame(rect);int displayHeight = rect.bottom - rect.top;//可见屏幕的高度,不包括顶部状态栏和底部虚拟按键int keyboardHeight = decorView.getHeight() - displayHeight - rect.top;//包括虚拟按键int bottomHeight = EdoPreference.getInt(EdoPreference.KEY_KEYBOARD_HEIGHT, 0);if(rect.bottom<decorView.getHeight()){//虚拟按键显示if(keyboardHeight>vmKeyHeight){//键盘处于显示状态keyboardHeight-=vmKeyHeight;if(keyboardHeight==bottomHeight){isKeyboardLastShow=true;return;}bottomHeight=keyboardHeight;}else {//只有虚拟按键显示,isKeyboardLastShow是boolean全局变量if(!isKeyboardLastShow)bottomHeight-=vmKeyHeight;}isKeyboardLastShow=true;}else{if(isKeyboardLastShow)bottomHeight+=vmKeyHeight;isKeyboardLastShow=false;}if (1.0 * bottomHeight / displayHeight > 0.4) {chatBottomView.setContentViewHeight(bottomHeight);EdoPreference.setPref(EdoPreference.KEY_KEYBOARD_HEIGHT, bottomHeight);}}});


												

Android虚拟键盘的高度计算相关推荐

  1. android监控虚拟键盘,android虚拟键盘的监控,显示和隐藏

    android虚拟键盘的监控,显示和隐藏 听到一个键盘监控[显示.隐藏]的问题,上网找了下解决方案. 有提到使用onSizeChange方法监控的,也有监控onLayout方法的. 思路:在弹出键盘时 ...

  2. android 虚拟键 高度,Android,获取虚拟键盘的高度

    在很多时候,很多需求下,我们都需要得知键盘的高度啊!实在不能理解为什么安卓不提供这样方便的API.虽然没有很好的监听事件,但是我们还是可以制造一个的.想想虚拟键盘弹起来之后界面发生了什么变化?对的,有 ...

  3. Android 虚拟键盘相关功能大全

    移动开发跟虚拟键盘肯定要打交道,下来我们就说说常用的相关情况: 情况一.将键盘右下角的确认更改 android:imeOptions="actionDone" ,软键盘下方变成&q ...

  4. android 虚拟键盘改变单个按键颜色_这款机械键盘很特别!一亿次按键寿命还有高颜值...

    电脑主机要上RGB,那外设自然不能落下,虽说没有60%性能加成,用炫酷的灯光点亮桌面的感觉也是不错的.德国老牌外设品牌--冰豹(ROCCAT)2018年发布了Vulcan系列机械键盘,凭借着独特的设计 ...

  5. android 虚拟键盘的显示与隐藏问题

    焦点改变时如何隐藏虚拟键盘 在开发过程中碰到了一个需求:在点击搜索框后,再点击别的地方,让虚拟键盘隐藏 在焦点改变时,隐藏虚拟键盘.在 listView 中添加焦点监听.其中 mEditText 为所 ...

  6. android华为手机虚拟键盘盖住底部,Android 虚拟键盘遮挡住页面问题我遇到的坑及个人解决办法...

    场景:某个页面多个组件.总体排版正好凑成满屏.一切按照UI给的标注效果图来.大部分机型测试通过.没有问题.华为手机有问题 兼容性:华为手机修改了虚拟键盘的位置.用户可以自由控制显示与隐藏虚拟键盘出现在 ...

  7. android虚拟键盘InputMethodManager使用

    InputMethodService为我们的输入法创建了一个Dialog,并且对某些参数进行了设置,使之能够在底部或者全屏显示. 在Activity中进行调整: AndroidManifet.xml中 ...

  8. Android虚拟键盘和虚拟触摸驱动

    1.虚拟键盘驱动 文件位置:kernel/drivers/input/keyboard/zebra_key.c #include <linux/module.h> #include < ...

  9. android 虚拟键盘高度,获取Android中虚拟键盘的高度

    您可以使用此示例代码.它是肮脏的解决方案,但它的工作 Thread t = new Thread(){ public void run() { int y = mainScreenView.getHe ...

最新文章

  1. zip/unzip 命令
  2. AI学会灌水和造假!Google新研究揭露了AI现实应用的陷阱
  3. linux环境下的小练习
  4. 吴恩达新书《Machine Learning Yearning》手稿完工,现在全集免费下载!(附pdf下载)
  5. Linux文本查看命令之touch
  6. 优化算法笔记|飞蛾扑火优化算法理解及实现
  7. Java多线程基础知识(一)
  8. Datawhale 零基础入门数据挖掘-Task3 特征工程
  9. Java专业人员必备工具 优缺点解析中文版
  10. 立即释放.net下的com组件
  11. 【手写数字识别】基于matlab GUI RBM神经网络手写数字识别【含Matlab源码 1109期】
  12. 使用wsimport命令将wsdl文件生成服务端以及客户端
  13. double比较大小
  14. gnome显示桌面图标_「GNOME 3」- 如何显示桌面图标? @20210123
  15. chr python用法_使用Python内建chr, ord实现的简单的加/解密
  16. 键盘与鼠标按键的键值对照表
  17. 对称加密 非对称加密
  18. chmod的使用 czy:czy 文件名
  19. 数说CS|中国人民大学高瓴人工智能学院保研生源大起底!
  20. 华为计算机平台芯片,华为连发两款AI芯片,计算力远超谷歌及英伟达

热门文章

  1. 织梦PHP版本怎么更新,织梦DedeCMS系统如何打补丁升级
  2. STM:一种新的肺癌标志物
  3. 也说程序员的中年危机
  4. 移动硬盘USB经常无法安全弹出
  5. 视频帧率与显示刷新率
  6. c语言timer linux 回调函数_C语言回调函数详解
  7. Jenkins 构建CI/CD(一看就会)
  8. Matlab MEX
  9. 全国外语水平考试(WSK)
  10. 三十、Fluent两种蒸发-冷凝模型理论及设置