布局适配的问题解决

news/2024/7/7 5:54:47

问题:布局由于虚拟按键导致导航栏顶上去的解决办法


首先写一个工具类:

public class AndroidWorkaround {
    public static void assistActivity(View content) {
        new AndroidWorkaround(content);
    }

    private View mChildOfContent;
    private int usableHeightPrevious;
    private ViewGroup.LayoutParams frameLayoutParams;

    private AndroidWorkaround(View content) {
        mChildOfContent = content;
        mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                possiblyResizeChildOfContent();
            }
        });
        frameLayoutParams = mChildOfContent.getLayoutParams();
    }

    private void possiblyResizeChildOfContent() {
        int usableHeightNow = computeUsableHeight();
        if (usableHeightNow != usableHeightPrevious) {

            frameLayoutParams.height = usableHeightNow;
            mChildOfContent.requestLayout();
            usableHeightPrevious = usableHeightNow;
        }
    }

    private int computeUsableHeight() {
        Rect r = new Rect();
        mChildOfContent.getWindowVisibleDisplayFrame(r);
        return (r.bottom);
    }

    public static boolean checkDeviceHasNavigationBar(Context context) {
        boolean hasNavigationBar = false;
        Resources rs = context.getResources();
        int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
        if (id > 0) {
            hasNavigationBar = rs.getBoolean(id);
        }
        try {
            Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
            Method m = systemPropertiesClass.getMethod("get", String.class);
            String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
            if ("1".equals(navBarOverride)) {
                hasNavigationBar = false;
            } else if ("0".equals(navBarOverride)) {
                hasNavigationBar = true;
            }
        } catch (Exception e) {

        }
        return hasNavigationBar;

    }
}
然后在需要调用的activity的onCreate()方法中调用

if (AndroidWorkaround.checkDeviceHasNavigationBar(this)) {
    AndroidWorkaround.assistActivity(findViewById(android.R.id.content));
}


http://www.niftyadmin.cn/n/3649250.html

相关文章

[ReportService]MS报表服务过期后的办法

嘿嘿,重装SqlServer Report Service即可。以前的那些报表重新发布一遍,虽然有点麻烦,可也只能这样了。嘿嘿,重装SqlServer Report Service即可。以前的那些报表重新发布一遍,虽然有点麻烦,可也只能这样了。…

QA的职责是人还是流程

QA的职责是人还是流程 IsQA About People or Process? 原作者: EdwardJ. Correia 译者:开心果, Jenvee, Jeff, Wally (微博:http://weibo.com/quicktest) 日期:2009-08-20 E测中国翻译团队作品 一旦发布版本的产品出现缺陷&…

Android开发之调用系统隐藏API

Android中有些Api被隐藏了,比如开关机,重启,如果要在应用中调用,要么用反射,要么就是直接在Android源代码下编译。如果用Eclipse用IDE,尽管调用隐藏API的代码能顺利在Android源码下通过编译,但E…

Delphi之东进数字语音卡(SS1)可复用源码

Delphi之东进数字语音卡(SS1)可复用源码作者:成晓旭Blog:http://blog.csdn.net/cxxsoft(声明:欢迎转载,请保证文章的完整性)由于工作原因,本人将不在从事商业应有软件的开发工作,现在开始逐级“解密”自己以…

沉浸式状态栏——状态栏的实现封装类

沉浸式状态栏有两种方式:一:当状态栏下面是一张图片的时候,设置上面状态栏为透明,这样状态栏就会被图片覆盖(这里为方便我设置了一个button颜色为#FF4081) 首先看下没有设置沉浸式状态栏时的状态栏: 设置状…

得到了国内第一本《And I thought I Knew QTP》

承蒙作者厚爱,得到了一本签名版的书,撒几张照片: 加我微博吧,分享更多测试讯息:http://www.weibo.com/quicktest 作者在米国发行此书的照片:

Android之探秘蓝牙隐藏API

上次讲解Android的蓝牙基本用法,这次讲得深入些,探讨下蓝牙方面的隐藏API。用过Android系统设置(Setting)的人都知道蓝牙搜索之后可以建立配对和解除配对,但是这两项功能的函数没有在SDK中给出,那么如何去使用这两项功能呢&#x…

golang flag 包_如何在Go中使用Flag包

golang flag 包介绍 (Introduction) Command-line utilities are rarely useful out of the box without additional configuration. Good defaults are important, but useful utilities need to accept configuration from users. On most platforms, command-line utilities…