精华内容
参与话题
问答
  • 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 Activi...
    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.
    
        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;
            }
        }
    
        private int computeUsableHeight() {
            Rect r = new Rect();
            mViewObserved.getWindowVisibleDisplayFrame(r);
            return (r.bottom - r.top);
        }
    }
    

    使用:

    //setContentView之后
    AndroidBug54971Workaround.assistActivity(findViewById(android.R.id.content));

     

    展开全文
  • 今天小编就为大家分享一篇快速解决Android适配底部返回键等虚拟键盘的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Android适配底部返回键等虚拟键盘的完美解决方案

    万次阅读 热门讨论 2016-09-06 18:34:55
    需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占满整个屏幕,当用户启用虚拟键时,应用能往上收缩,等于是被底部虚拟按键顶上来。 需求很简单,实现起来却困难重重。 完美解决方案: 解释一下下面...

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

    场景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);
    展开全文
  • 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占满整个屏幕,当用户启用虚拟键时,应用能往上收缩,等于是被底部虚拟按键顶上来。 需求很简单,实现起来却困难重重。 完美解决方案: 解释一下...

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

    场景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);

     

    展开全文
  •  需求:需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占满整个屏幕,当用户启用虚拟键时,应用能往上收缩,等于是被底部虚拟按键顶上来。解决方案:监听某个视图变化,当可以看见高度发生变化时,就...

    问题:华为手机遮挡了文章底部的评论、分享、点赞等。


     需求:

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

    解决方案:

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

    添加工具类

    public class HuaWeiBottomUiFit {

    /**

    * 关联要监听的视图 *

    * @param viewObserving

    */

    public static void assistActivity(ViewviewObserving) {

         new HuaWeiBottomUiFit(viewObserving);

    }

    private View mViewObserved;//被监听的视图

    private int usableHeightPrevious;//视图变化前的可用高度

    private ViewGroup.LayoutParamsframeLayoutParams;

     

    private HuaWeiBottomUiFit(ViewviewObserving) {

       mViewObserved = viewObserving;

       //View添加全局的布局监听器

       mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(newViewTreeObserver.OnGlobalLayoutListener() {

           public void onGlobalLayout() {

               resetLayoutByUsableHeight(computeUsableHeight());

           }

       });

       frameLayoutParams = mViewObserved.getLayoutParams();

    }

     

    private void resetLayoutByUsableHeight(intusableHeightNow) {

       //比较布局变化前后的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);

    }

    }

    然后在你需要解决这个问题的ActivityonCreate方法的setContentView(R.layout.contentframe);后面添加上 setContentView(R.layout.contentframe);HuaWeiBottomUiFit.assistActivity(findViewById(android.R.id.content));

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

    解决后:


    展开全文
  • android:fitsSystemWindows=”true” 这句话写在layout根目录下,看名字就知道是自适应系统窗口。可以能解决很大一部分手机了, 可以自己查看 :具体详细 [地址](https://www.cnblogs.com/xgjblog/p/8482567.html) ...
  • 普通的底部弹出框大家都可以很熟练...更别说加上底部虚拟键了,这么一个小功能磨得我简直吐血。。。下面就是我的血泪史。 第一阶段: 首先是底部dialog与软键盘的冲突: View myView = LayoutInflater.from(MainAc...
  • 254.调整虚拟光驱与物理光驱盘符 255.卸载虚拟光驱时丢失了物理光驱 256.光驱变成了“可移动磁盘” 257.光驱读盘时死机 258.光盘在光驱中不转动 259.光驱打滑造成不能读盘 260.光驱显示上一张光盘中内容 261....
  • Vuforia丨虚拟按键

    2019-08-19 10:45:07
    实现效果: 实现步骤: 1、Unity新建ImageTarget,在其下方新建VirtualButton ...那如何判断这些button哪个是哪个,就通过自定义他们名字不同。 3、在InageTarget下新建cube和sphere,并...
  • Android 隐藏虚拟按键

    2019-09-04 11:56:07
    Android 隐藏虚拟按键 领导要求: 横屏播放视频时,不展示虚拟按键; 恢复到竖屏时,展示虚拟按键; /** * NavigationBar 显示与隐藏 */ public class NavigationBarHelper { private Fragment fragment; ...
  • android 隐藏底部虚拟按键

    千次阅读 2019-07-03 12:43:42
    隐藏底部虚拟按键,但是如果你在底部网上滑动还是显示出来, 我在项目中写在了BaseActivity里面,大致如下 ,我这用在贩卖机上面,手机上app开发还真没用过, 下面测试可以使用,已经使用在项目上了。。。。...
  • android虚拟按键的实现

    千次阅读 2015-02-27 16:33:35
    以前看过好几次东西又忘记了....SystemUI中虚拟按键的实现(Home, Back, Recently) 以Home键为例: 在layout中,定义Home键为一个KeyButtonView  xmlns:android="http://schemas.android.com/apk/res/android"  xmln
  • Android如何隐藏底部虚拟按键

    万次阅读 2016-06-10 13:34:33
    虚拟按键隐藏相信大家在做屏幕适配时候,会对虚拟按键问题或多或少有一些疑问,接下来带给大家解决虚拟按键的方法。android隐藏底部虚拟键Navigation Bar实现全屏 安卓4.1之后为全虚拟键操作,和actionbar对应,...
  • 如何隐藏Android模拟器的虚拟按键

    千次阅读 2018-11-13 15:30:21
    但是在编辑过程中,总是发现令人恶心黑不溜秋的虚拟按键,很影响我们进行屏幕适配,如下图: 那么如何才能如掉这个虚拟按键呢? 原理:修改system下build.prop文件内参数 操作如下: 1.找到指定AVD...
  • RelaxFinger ...一款简洁的虚拟按键助手 从酷安市场下载悬浮助手 特点: 采用安卓辅助功能开发,绿色安全。 不需要获取 root 权限。 占用内存低,资源消耗少。 操作流畅,反应敏捷,无延迟。 ...
  • 官方原文链接Dim the Status and ...(隐藏状态栏和导航条)You can dim the status and notification bars on Android 4.0 and higher using the SYSTEM_UI_FLAG_LOW_PROFILE flag, as follows:// This example uses de
  • 做一个项目,底部的按钮被虚拟按键挡住了,用android:fittemWindows="true"这个之后,虚拟按键不遮挡了,可是沉浸式状态栏不行了。 于是换了在styles里设置windowTranslucentStatus,windowTranslucentNavigation这...

空空如也

1 2 3 4 5 ... 20
收藏数 2,368
精华内容 947
关键字:

虚拟按键