快速解决Android适配底部返回键等虚拟键盘的问题

 更新时间:2018年07月28日 10:13:00   作者:NicolaAndMartin  
今天小编就为大家分享一篇快速解决Android适配底部返回键等虚拟键盘的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

这个问题来来回回困扰了我很久,一直没能妥善解决。

场景1:华为手机遮挡了屏幕底部。

场景2:进入应用时,虚拟键自动缩回,留下空白区域。

需求:

需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占满整个屏幕,当用户启用虚拟键时,应用能往上收缩,等于是被底部虚拟按键顶上来。

需求很简单,实现起来却困难重重。

完美解决方案:

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

首先添加工具类AndroidBug54971Workaround

package com.xxxx.xxxx;

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:fitsSystemWindows=”true” 

这句话写在layout的根目录下,看名字就知道是自适应系统窗口。估计能解决很大一部分手机了,可是在同事的nexus 4下并没有什么用。

第二种方法:

我去掉了每个布局的android:fitsSystemWindows=”true”

在style文件中添加了这句话。

<item name="android:windowTranslucentNavigation">false</item>

注意: 你会发现系统报错,这是因为这句话是在API-19后才有的,所以你可以复制你的style文件,把它放到API-19的文件夹下。这样的用途就是如果手机大于等于API19,就会用API-19的文件夹下的内容。否则用原来的style文件。你在API19文件夹下的style文件的根主题中添加上面这句话就OK啦。

本来我以为是完美解决了我的问题。可是被打脸了。刚进入App时会出现上面的场景2的情况。

我一看MainActivity中的onCreate方法的setContentView(R.layout.xxxx);之前有下面的代码

//控制底部虚拟键盘
  getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
      | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
      | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
      | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
//      | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
      | View.SYSTEM_UI_FLAG_IMMERSIVE);

估计是这个项目以前的仁兄为了解决这个问题添加的。

经过多次调试,我添加了一句话

  //控制底部虚拟键盘
  getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
      | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
      | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
      | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
//      | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
      | View.SYSTEM_UI_FLAG_IMMERSIVE);
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

场景2的情况解决了。这是在虚拟键一直存在的情况下没有问题了,因为nexus不能手动隐藏虚拟键盘,所以我也不清楚是否能在华为等手机上正常运行。TODO。

另外如果想要一直隐藏虚拟键盘,点击屏幕也不会出现的话,将上面的代码换成:

  //让虚拟键盘一直不显示
  Window window = getWindow();
  WindowManager.LayoutParams params = window.getAttributes();
  params.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE;
  window.setAttributes(params);

以上这篇快速解决Android适配底部返回键等虚拟键盘的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Android实现简易闹钟功能

    Android实现简易闹钟功能

    这篇文章主要为大家详细介绍了Android实现简易闹钟功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Android实现通用筛选栏

    Android实现通用筛选栏

    这篇文章主要为大家详细介绍了Android实现通用筛选栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • Android 彩色Toast的实现代码

    Android 彩色Toast的实现代码

    这篇文章主要介绍了Android 彩色Toast的实现代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • Android RecyclerView艺术般的控件使用完全解析

    Android RecyclerView艺术般的控件使用完全解析

    这篇文章主要介绍了Android RecyclerView艺术般的控件使用完全解析的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • 利用Android封装一个有趣的Loading组件

    利用Android封装一个有趣的Loading组件

    这篇文章我们将利用Android封装一个可以自定义配置前景色和背景色的Loading组件,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-08-08
  • 解决Android 虚拟按键遮住了页面内容的问题

    解决Android 虚拟按键遮住了页面内容的问题

    今天小编就为大家分享一篇解决Android 虚拟按键遮住了页面内容的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Android自定义View实现圆弧进度效果

    Android自定义View实现圆弧进度效果

    这篇文章主要为大家详细介绍了Android自定义View实现圆弧进度效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 关于gradle你应该知道的一些小事

    关于gradle你应该知道的一些小事

    这篇文章主要给大家介绍了关于gradle你应该知道的一些小事,文中通过示例代码介绍的非常详细,对大家学习或者使用gradle具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • 深踩Android Studio 缓存的坑及解决方法

    深踩Android Studio 缓存的坑及解决方法

    这篇文章主要介绍了深踩Android Studio 缓存的坑及解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Android学习笔记——Menu介绍(三)

    Android学习笔记——Menu介绍(三)

    今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
    2014-10-10

最新评论