码迷,mamicode.com
首页 > 移动开发 > 详细

Android 沉浸式状态栏

时间:2016-01-23 17:58:16      阅读:391      评论:0      收藏:0      [点我收藏+]

标签:

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" 

 


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

Android 沉浸式状态栏

标签:

原文地址:http://www.cnblogs.com/niray/p/5153530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!