zoukankan      html  css  js  c++  java
  • Android 沉浸式状态栏

    extends:

    https://www.zhihu.com/question/22102139 , 

    http://www.2cto.com/kf/201504/395290.html , 

    http://blog.csdn.net/u010255127/article/details/49308775 , 

    http://www.bubuko.com/infodetail-1004629.html , 

    http://www.bubuko.com/infodetail-1004629.html , 

    http://blog.csdn.net/u010255127/article/details/49308775,

    http://tiku.io/questions/177218/keyboard-hiding-edittext-when-androidwindowtranslucentstatus-true

    在Android4.4设备上支持沉浸式状态栏,只需要添加values-v19/styles.xml 下添加 

     <style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar" type="text/css"><item name="android:windowTranslucentNavigation">false</item>
    <item name="android:windowTranslucentStatus">true</item>
    </
    style>

    亦或是通过JAVA代码实现,不过通过代码实现的时候要在每次Activity onCreate 周期里实现一下代码

              

        public static void setImmerseLayout(View topBgView, Activity act) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                //设置为沉浸式
                act.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    
                //如果是MIUI主体,则设置为黑色的通知字体, 因为MIUI没有遮罩
                MIUIFlymeUtils.setStatusBarTextColor(act);
                MIUIFlymeUtils.setStatusBarDarkIcon(act.getWindow(), true);
                //状态栏高度
                int statusBarHeight = IUtil.getStatusHeight();
                ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) topBgView.getLayoutParams();
                params.height = statusBarHeight;
                topBgView.setLayoutParams(params);
    
            }
        }

    然后下第三方定制的UI中会出现白底白字的情况,例如MIUI和Flyme系统中

     
    
    import android.app.Activity;
    import android.os.Build;
    import android.util.Log;
    import android.view.Window;
    import android.view.WindowManager;
    
    import java.io.IOException;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    //著作权归作者所有。
    //        商业转载请联系作者获得授权,非商业转载请注明出处。
    //        作者:Mariotaku
    //        链接:https://www.zhihu.com/question/22102139/answer/24834510
    //        来源:知乎
    //// 检测MIUI
    // 检测Flyme
    
    public final class MIUIFlymeUtils {
    
        private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
        private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
        private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";
    
        /*
        * 只支持MIUI V6
        * @param context
        * @param type 0--只需要状态栏透明 1-状态栏透明且黑色字体 2-清除黑色字体
        */
        public static void setStatusBarTextColor(Activity context) {
            int type = 1;
            if (!isMIUI()) {
                Log.d("ActionBar", "isMiUIV6:" + false);
                return;
            }
            Log.d("ActionBar", "isMiUIV6:" + true);
            Window window = context.getWindow();
            Class clazz = window.getClass();
            try {
                int tranceFlag = 0;
                int darkModeFlag = 0;
                Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
                Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_TRANSPARENT");
                tranceFlag = field.getInt(layoutParams);
                field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
                darkModeFlag = field.getInt(layoutParams);
                Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
                if (type == 0) {
                    extraFlagField.invoke(window, tranceFlag, tranceFlag);//只需要状态栏透明
                } else if (type == 1) {
                    extraFlagField.invoke(window, tranceFlag | darkModeFlag, tranceFlag | darkModeFlag);//状态栏透明且黑色字体
                } else {
                    extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
                }
            } catch (Exception e) {
    
            }
        }
    
        //魅族:
        public static boolean setStatusBarDarkIcon(Window window, boolean dark) {
            boolean result = false;
            if (window != null) {
                try {
                    WindowManager.LayoutParams lp = window.getAttributes();
                    Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
                    Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");
                    darkFlag.setAccessible(true);
                    meizuFlags.setAccessible(true);
                    int bit = darkFlag.getInt(null);
                    int value = meizuFlags.getInt(lp);
                    if (dark) {
                        value |= bit;
                    } else {
                        value &= ~bit;
                    }
                    meizuFlags.setInt(lp, value);
                    window.setAttributes(lp);
                    result = true;
                } catch (Exception e) {
                    Log.e("MeiZu", "setStatusBarDarkIcon: failed");
                }
            }
            return result;
        }
        private static boolean isMiUIV6() {
            try {
                final BuildProperties prop = BuildProperties.newInstance();
                String name = prop.getProperty(KEY_MIUI_VERSION_NAME, "");
                if ("V6".equals(name)) {
                    return true;
                } else {
                    return false;
                }
    //            return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null
    //                    || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null
    //                    || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;
            } catch (final IOException e) {
                return false;
            }
        }
    
    
        public static boolean isMIUI() {
            try {
                final BuildProperties prop = BuildProperties.newInstance();
                return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null
                        || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null
                        || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;
            } catch (final IOException e) {
                return false;
            }
        }
    
    
        public static boolean isFlyme() {
            try {
                // Invoke Build.hasSmartBar()
                final Method method = Build.class.getMethod("hasSmartBar");
                return method != null;
            } catch (final Exception e) {
                return false;
            }
    
    
        }
    }
     
    //引用到的工具类
    
    import android.os.Environment;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Collection;
    import java.util.Enumeration;
    import java.util.Map.Entry;
    import java.util.Properties;
    import java.util.Set;
    
    public class BuildProperties {
    
        private final Properties properties;
    
        private BuildProperties() throws IOException {
            properties = new Properties();
            properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
        }
    
        public static BuildProperties newInstance() throws IOException {
            return new BuildProperties();
        }
    
        public boolean containsKey(final Object key) {
            return properties.containsKey(key);
        }
    
        public boolean containsValue(final Object value) {
            return properties.containsValue(value);
        }
    
        public Set<Entry<Object, Object>> entrySet() {
            return properties.entrySet();
        }
    
        public String getProperty(final String name) {
            return properties.getProperty(name);
        }
    
        public String getProperty(final String name, final String defaultValue) {
            return properties.getProperty(name, defaultValue);
        }
    
        public boolean isEmpty() {
            return properties.isEmpty();
        }
    
        public Enumeration<Object> keys() {
            return properties.keys();
        }
    
        public Set<Object> keySet() {
            return properties.keySet();
        }
    
        public int size() {
            return properties.size();
        }
    
        public Collection<Object> values() {
            return properties.values();
        }
    }

    但是开启沉浸状态栏后,回出现

    android:windowSoftInputMode=”adjustResize|stateHidden”

    失效

    这时候需要在有EditText需要弹出输入法的页面的根目录里添加 

    android:fitsSystemWindows="true" 

    然后处理一下状态栏背景色

  • 相关阅读:
    是否需要有代码规范
    小学四则运算生成程序(支持分数)总结
    HDU 4035 Maze 期望dp
    UVA
    HDU 3853 LOOPS 期望dp
    POJ 2096 Collecting Bugs 期望dp
    HDU 4405 Aeroplane chess 期望dp
    Codeforces Round #341 (Div. 2) E. Wet Shark and Blocks dp+矩阵加速
    HDU 4616 Game 树形dp
    HDU 4126 Genghis Khan the Conqueror 最小生成树+树形dp
  • 原文地址:https://www.cnblogs.com/niray/p/5153530.html
Copyright © 2011-2022 走看看