一android沉浸式+虚拟按键

沉浸遇上了华为的虚拟键盘,当android:fitsSystemWindows设置为false就会出现下面布局被遮挡的情况,尤其是部分没法隐藏的机器。

百度之后大多数居然是让去掉沉浸式。要么这个设置 android:fitsSystemWindows="true"。但是设置成true我的Banner滚动图片显示不到标题栏上,尴尬。最后找到一片文章参考然后自己改了下完美实现,

个人思路


红色框表示屏幕,蓝色表示我首页的主布局,黑色表示根据虚拟按钮的背景,因为设置成透明色默认显示不好看。思路是求出显示区域大小,根据大小调整蓝色区域,这时候黑色区域会根据蓝色区域大小上移动活着下移动。所以在布局中黑色区域高度可以大但是不能小。

布局文件:

<?xml version="1.0" encoding="utf-8"?>
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#0000"
    >

//这是蓝色区域布局因为是主页布局
            android:id="@+id/line"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"

android:background="#fff"
        >
       //主要布局显示首页
   

//黑色区域主要是用来当虚拟按键的样色
                    android:id="@+id/butt"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:background="#000">


//用来计算蓝色区域高度的工具类

public class AndroidBag {
    // 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,Activity activity) {
        new AndroidBag(viewObserving,activity);
    }


    private View mViewObserved;//被监听的视图
    private int usableHeightPrevious;//视图变化前的可用高度
    private ViewGroup.LayoutParams frameLayoutParams;
    Activity activity;
    private AndroidBag(View viewObserving ,Activity activity) {
        this.activity=activity;
        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);
        Display display = activity.getWindowManager().getDefaultDisplay();
        return ((r.bottom - r.top)+display.getHeight()-(r.bottom - r.top));
    }
}

沉浸式代码和调用代码

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Window window = getWindow();
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                        | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  //该参数指布局能延伸到navigationbar,我们场景中不应加这个参数
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.setStatusBarColor(Color.TRANSPARENT);
                window.setNavigationBarColor(Color.TRANSPARENT); //设置navigationbar颜色为透明
            }else {
                Window window = getWindow();
                window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
 }

     调用代码

AndroidBag.assistActivity(findViewById(R.id.line),this);


参考地址http://blog.csdn.net/c15522627353/article/details/52452490

更多相关文章

  1. android平板上的GridView视图缓存优化
  2. Android(安卓)自己动手写ListView学习其原理 2 上下滚动
  3. android main.xml分析。。一点点补充
  4. Android屏幕密度(Density)和分辨率的关系
  5. Android(安卓)开发之旅:view的几种布局方式及实践
  6. Android(安卓)开发知识收藏夹(2)
  7. Android入门教程四十二之GridView(网格视图)的基本使用
  8. Android面试系列文章2018之Android部分之ViewPager篇
  9. 视图模式:Android(安卓)ViewPager & WP Pivot

随机推荐

  1. 我会经常在这个地址下面共享自己保存的几
  2. Android初级工程师面试题答案——Android
  3. android binder机制之--(我是Service Mana
  4. Android(安卓)RecyclerView实现九宫格效
  5. Android(安卓)TextView加载html图片详解
  6. 第一个PhoneGap程序以及错误解决
  7. Android入门(2) 基本控件介绍、4种布局
  8. Android学习——Activity生命周期
  9. 安装 Android(安卓)2.3 could not find a
  10. Android中的Handler的机制与用法详解