zoukankan      html  css  js  c++  java
  • android 透明状态栏方法及其适配键盘上推(一)

    android的状态栏(statusBar)版本的差异化比较大。在android 4.4 以上和5.x可以设置状态栏背景颜色,但是不可以设置状态栏中字和图标的颜色。而系统默认的statusbar的字体和图标颜色为白色。如果在6.0以下的要实现透明状态栏(也就是把整个界面延伸到statusbar),就要考虑到如果您的应用背景颜色为白色的时候,会出现statusbar里的内容都看不清楚,这一点暂时是没办法去适配的。但是6.0以上的是既能修改statusbar的背景颜色,也可以修改statusbar的字体和图标颜色(只能是黑色或是白色)。

    实现透明状态栏有两种方法:

    1.通过toolbar去实现。然后在root xml里配置:fitSystemWindows 就可以

       

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/transparent"
        android:theme="@style/ActionBarTheme" />
    

    ActionBarTheme的style为:

     <style name="ActionBarTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    
            <item name="android:textColorPrimary">@android:color/white</item>
            <item name="android:windowTranslucentStatus" tools:targetApi="19">true</item>
    
            <item name="android:windowContentOverlay">@null</item>
            <item name="windowActionBar">false</item>
    
            <!-- Material Theme -->
            <item name="colorPrimary">@color/transparent</item>
            <item name="colorPrimaryDark">@color/transparent</item>
    
            <item name="android:statusBarColor" tools:targetApi="21">@color/transparent</item>
            <item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="21">true</item>
    
        </style>
    

      在Activity里加入:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    

     但是这样设置后,会发现,有编辑框的界面,在manifest里及时配置了adjustResize,键盘弹出后,也不会把界面上推,会导致键盘会覆盖到编辑框(如果您应用的编辑框距离底部比较近),体验很不好。这个时候,您需要的是在这个界面里加入自己定义的view,同时去override fitSystemWindows方法以及omApplyWindowInsets方法。

      

    public class SoftInputAdjustTopView extends RelativeLayout {
    
        private int[] mInsets = new int[4];
    
        public SoftInputAdjustTopView(Context context) {
            super(context);
        }
    
        public SoftInputAdjustTopView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public SoftInputAdjustTopView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        @Override
        protected final boolean fitSystemWindows(Rect insets) {
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                mInsets[0] = insets.left;
                mInsets[1] = insets.top;
                mInsets[2] = insets.right;
                insets.left = 0;
                insets.top = 0;
                insets.right = 0;
            }
            return super.fitSystemWindows(insets);
        }
    
        @Override
        public final WindowInsets onApplyWindowInsets(WindowInsets insets) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                mInsets[0] = insets.getSystemWindowInsetLeft();
                mInsets[1] = insets.getSystemWindowInsetTop();
                mInsets[2] = insets.getSystemWindowInsetRight();
                return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,
                        insets.getSystemWindowInsetBottom()));
            } else {
                return insets;
            }
        }
    }
    

      这样就可以很好的实现适配问题。

     

      

      

  • 相关阅读:
    LeetCode对撞指针汇总
    167. Two Sum II
    215. Kth Largest Element in an Array
    2018Action Recognition from Skeleton Data via Analogical Generalization over Qualitative Representations
    题解 Educational Codeforces Round 84 (Rated for Div. 2) (CF1327)
    题解 JZPKIL
    题解 八省联考2018 / 九省联考2018
    题解 六省联考2017
    题解 Codeforces Round #621 (Div. 1 + Div. 2) (CF1307)
    题解Codeforces Round #620 (Div. 2)
  • 原文地址:https://www.cnblogs.com/StephenWu/p/5838881.html
Copyright © 2011-2022 走看看