今天,看到关于虚拟键盘的内容,于是记录一下。

如果是控件,可以直接使用Android:fitsSystemWindows=”true”),但是如果是popwindow,那就必须获取虚拟键盘的大小,来确定位置。

可以发现,虚拟键位,挡住了取消按钮的触控区域,网上百度一下,大多是在布局内家加上(Android:fitsSystemWindows=”true”) ,BUT我的控件不是布局,里面写好的啊!我采用的自定义布局,SO 问题就是如何让取消按钮的触控区域显示出来。

解决办法:获取虚拟键高度,然后定位显示布局的位置

public static Point getNavigationBarSize(Context context) {Point appUsableSize = getAppUsableScreenSize(context);Point realScreenSize = getRealScreenSize(context);// navigation bar on the rightif (appUsableSize.x < realScreenSize.x) {return new Point(realScreenSize.x - appUsableSize.x, appUsableSize.y);}// navigation bar at the bottomif (appUsableSize.y < realScreenSize.y) {return new Point(appUsableSize.x, realScreenSize.y - appUsableSize.y);}// navigation bar is not presentreturn new Point();
}public static Point getAppUsableScreenSize(Context context) {WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display display = windowManager.getDefaultDisplay();Point size = new Point();display.getSize(size);return size;
}public static Point getRealScreenSize(Context context) {WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display display = windowManager.getDefaultDisplay();Point size = new Point();if (Build.VERSION.SDK_INT >= 17) {display.getRealSize(size);} else if (Build.VERSION.SDK_INT >= 14) {try {size.x = (Integer) Display.class.getMethod("getRawWidth").invoke(display);size.y = (Integer) Display.class.getMethod("getRawHeight").invoke(display);} catch (IllegalAccessException e) {} catch (InvocationTargetException e) {} catch (NoSuchMethodException e) {}}return size;
}

另外还有一种解决问题的方案。

完美解决方案:

解释一下下面的代码,就是监听某个视图的变化,当可以看见的高度发生变化时,就对这个视图重新布局,保证视图不会被遮挡,也不会浪费屏幕空间。这一点尤其可用在像华为手机等可以隐藏和显示虚拟键盘上导致屏幕变化的手机上。

  • 首先添加工具类AndroidBug54971Workaround
package com.o2fun.vobot.common;import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;/*** Created by win7 on 2016/12/14.*/public class AndroidBug54971Workaround {// For more information, see https://code.google.com/p/android/issues/detail?id=5497// To use this class, simply invoke assistActivity() on an Activity that already has its content view set./*** 关联要监听的视图** @param viewObserving*/public static void assistActivity(View viewObserving) {new AndroidBug54971Workaround(viewObserving);}private View mViewObserved;//被监听的视图private int usableHeightPrevious;//视图变化前的可用高度private ViewGroup.LayoutParams frameLayoutParams;private AndroidBug54971Workaround(View viewObserving) {mViewObserved = viewObserving;//给View添加全局的布局监听器mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {public void onGlobalLayout() {resetLayoutByUsableHeight(computeUsableHeight());}});frameLayoutParams = mViewObserved.getLayoutParams();}private void resetLayoutByUsableHeight(int usableHeightNow) {//比较布局变化前后的View的可用高度if (usableHeightNow != usableHeightPrevious) {//如果两次高度不一致//将当前的View的可用高度设置成View的实际高度frameLayoutParams.height = usableHeightNow;mViewObserved.requestLayout();//请求重新布局usableHeightPrevious = usableHeightNow;}}/*** 计算视图可视高度** @return*/private int computeUsableHeight() {Rect r = new Rect();mViewObserved.getWindowVisibleDisplayFrame(r);return (r.bottom - r.top);}
}

然后在你需要解决这个问题的Activity的onCreate方法的setContentView(R.layout.content_frame);后面添加上

setContentView(R.layout.content_frame);AndroidBug54971Workaround.assistActivity(findViewById(android.R.id.content));

如果你看的懂代码,你肯定知道assistActivity方法里放入的View是你 要调整高度的视图。

android 布局适配虚拟键适配就讲完了。

就这么简单。



android 布局适配虚拟键适配相关推荐

  1. 手淘启动页全面屏和虚拟键适配

    背景 华为对新发布的机器进行适配测试,发现手淘存在全面屏适配问题,随后还附了个3页的文档,文档比较粗泛的描述了一下不适配将会存在的问题,适配可以采取的措施,以及Google开发者文档.简单来说,因为全 ...

  2. android自动隐藏虚拟键,Android 隐藏底部虚拟键的两种方法

    方法一  滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT > 1 ...

  3. android实现底部弹出框与软键盘冲突(全面屏虚拟键适配)

    普通的底部弹出框大家都可以很熟练的使用了,无非是一个diaolog的事情,但是当dialog中含有输入框之后,软键盘与dialog的冲突可以说是十分坑了...更别说加上底部虚拟键了,这么一个小功能磨得 ...

  4. 全面屏/刘海屏及虚拟键适配--总结版

    什么是刘海屏? 随着iPhone X发布,刘海屏手机大行其道 ,Google Android P版本的发布,也引入了刘海屏的概念 即将发布的Android p也提供了对刘海屏的支持.像 华为P20 p ...

  5. 全面屏虚拟键适配方案

    写之前先吐槽下自己,工作了这么多年,终于能静下心来写博客了 最近公司有个需求,要实现类似于抖音的小视频全屏播放的样式,当虚拟键盘展示的时候,竖屏视频就撑满整个屏幕,当虚拟键盘隐藏的时候,就需要让视频底 ...

  6. android华为手机虚拟键,华为手机为何“固执”地保留屏内虚拟按键?答案揭秘!...

    本帖最后由 请称呼我所长 于 2017-9-5 00:33 编辑 0.jpg (39.44 KB, 下载次数: 158) 2017-9-3 15:12 上传 最in科技所,好玩的.新鲜的科技资讯都在这 ...

  7. Android 解决华为虚拟键冲突遮挡底部按钮

    监听某个视图的变化,当可以看见的高度发生变化时,就对这个视图重新布局,保证视图不会被遮挡,也不会浪费屏幕空间. 这一点尤其可用在像华为手机等可以隐藏和显示虚拟键盘上导致屏幕变化的手机上. 这里提供一个 ...

  8. android开发底部虚拟键,android手机底部的虚拟按键怎么弄,像android平板那样。

    前言: 现在很多安卓手机都取消了实体键或者触摸键,那么,代替这些按键的就是手机的虚拟按键了,比如GN.N4等手机都有虚拟按键,你是不是觉得这些虚拟按键很有趣呢?其实,谷歌在发布安卓4.0的时候,就为系 ...

  9. android适配华为虚拟键

    在做横竖屏展示时,发现网上适配虚拟键代码没有做横屏状态下适配,导致横屏状态下,底部虚拟键遮挡了布局内容. 所以横屏状态下也需要适配华为虚拟键.只需要在content布局改变时,同时记录当前可用的视图宽 ...

最新文章

  1. html列表中float-left,floatleft的作用
  2. favicon自动获取_友情链接前面自动获取并添加favicon.ico小图标
  3. Golang unsafe.Pointer指针
  4. hdu 4676 Sum Of Gcd 莫队+phi反演
  5. springMVC面试问题整理一
  6. Python:函数变量的使用
  7. mybatis集成 Invalid bound statement (not found)
  8. 原生的强大DOM选择器querySelector - querySelector和querySelectorAll
  9. 专栏 | IBM Watson启示录:AI不应该仅仅是炫技
  10. 最全下载jar包的网站
  11. Linux进程相关的一些笔记
  12. 用PHP写Yaf:Yaf_Registry类
  13. 在HTML中添加图片阴影,html – 如何在CSS中为图像添加内部阴影[复制]
  14. 求一个任意实数的算术平方根的算法设计_感恩!面试必刷100道算法题
  15. android使用遥控器模拟鼠标拖拽操作
  16. 数据库实验五-数据库设计实验
  17. 华为交换机配置时区_华为交换机配置命令
  18. 战网在线更改服务器,战网怎么改地区 战网改地区的具体方法介绍
  19. DOIP SOME/IP
  20. Transfer Learning从入门到放弃(二)

热门文章

  1. 并发容器之CopyOnWriteArrayList
  2. Ulua_toLua_基本案例(八)_LuaAccessingArray
  3. ubuntu12.04.5安装openssh-server所引发的血案
  4. UVa 11762 (期望 DP) Race to 1
  5. 数学图形(1.42)拱形曲线
  6. vmware 指定的网络名不可用
  7. HTML相对路径(Relative Path)和绝对路径(Absolute Path)
  8. vue的列表交错过渡
  9. 50 【Go版本变化】
  10. python中requests的用法总结