当前位置: 移动技术网 > IT编程>移动开发>Android > Android 状态栏的设置适配问题详解

Android 状态栏的设置适配问题详解

2019年07月24日  | 移动技术网IT编程  | 我要评论

吴克群个人资料,老大dj,安徽合肥邮政编码

android 状态栏的设置适配问题详解

最近看了很多关于状态栏的问题的处理,总结出处理状态栏分两个方向1>5.0一下2>5.0以上的手机状态栏的设置,,,,,,,,这里说的都是自定义的toolbar,我这里已经把titlebar给隐藏掉了

(1) 关于5.0一下:首先我们需要在res文件下的style中设置,

<!-- base application theme. -->
<style name="apptheme" parent="apptheme.base">
  <!-- customize your theme here. -->

</style>
<style name="apptheme.base" parent="theme.appcompat.light.noactionbar">
  <item name="colorprimary">@color/colorprimary</item>
  <item name="colorprimarydark">@color/colorprimarydark</item>
  <item name="coloraccent">@color/coloraccent</item>
  <item name="android:windowbackground">@android:color/white</item>
  <item name="android:windownotitle">true</item>
</style>

这里我为什么设置apptheme.base  而不直接用apptheme,因为我继承的是appcompatactivity,如果直接对titlebar进行隐藏的话不做这个base处理,程序会报错,,,,,,如果你继承的是activity的话那不会报错 ,,,,为了处理 版本的更高适配,,,,就必须继承   appcompatactivity ,,,所以在适配5.0一下的系统的时候,就要做一个 base 来过渡 加载 style...

5.0一下的到此就结束了....

(2) 关于5.0以上的版本,,我门要在res下方增加一个 values-21文件,结构如图

置于style中的代码:如下

<style name="apptheme.noactionbar">
  <item name="windowactionbar">false</item>
  <item name="windownotitle">true</item>
  <item name="android:windowdrawssystembarbackgrounds">true</item>
  <item name="android:statusbarcolor">@android:color/transparent</item>
</style>

<style name="apptheme" parent="theme.appcompat.light.noactionbar">
  <item name="colorprimary">@color/colorprimary</item>
  <item name="colorprimarydark">@color/colorprimarydark</item>
  <item name="coloraccent">@color/coloraccent</item>
  <item name="android:windowdrawssystembarbackgrounds">true</item>
  <!-- 标题颜色 -->
  <item name="android:textcolorprimary">#000</item>
  <!-- 溢出菜单图标颜色 -->
  <item name="colorcontrolnormal">@color/white</item>
  <!-- 箭头 -->
  <item name="drawerarrowstyle">@style/drawerarrowstyle</item>
  <!-- 溢出菜单文字颜色 -->
  <item name="textappearancelargepopupmenu">@style/overflowmenutextappearance</item>
  <!-- 菜单项点击selector -->
  <item name="actionbaritembackground">@drawable/abc_item_background_holo_dark</item>
</style>

<!-- 左边的箭头指示 -->
<style name="drawerarrowstyle" parent="widget.appcompat.drawerarrowtoggle">
  <item name="spinbars">true</item>
  <item name="color">@color/white</item>
</style>

<!-- 溢出菜单文字样式 -->
<style name="overflowmenutextappearance" parent="@style/textappearance.appcompat.widget.popupmenu.large">
  <item name="android:textcolor">@color/white</item>
</style>

手机会 根据 你手机的系统版本去加载,这两个style,5.x以上的 加载第二个 ,针对 不同的系统版本修改对应的style..........

当然 这两步足够做适配的了,但是 我们 可能需要进入不同界面 显示不通的状态栏,,,这时候 就要我们用代码控制,修改了,,,,代码 我也直接贴出来 ,,,一下 代码 是 看别人的.......

 (1)  在activity设置 这些,,,

   int color = getresources().getcolor(r.color.red);

//    view view = layoutinflater.from(this).inflate(r.layout.statusbar,null);
    statusbarmanager statusbarmanager = new statusbarmanager(this,color);
    //这里如果要移动titlebar,则在布局中指定为include的自定义statusbar的view
    //如果不指定,则调用setstatusbarview();会自动加一个view
//    statusbarmanager.setstatusbarview(view);
    statusbarmanager.setstatusbarview();

(2)重写 一个类statusbarmanager 进行修改 :

package com.example.administrator.statusbartest;

import android.annotation.targetapi;
import android.app.activity;
import android.content.context;
import android.graphics.color;
import android.os.build;
import android.view.view;
import android.view.viewgroup;
import android.view.window;
import android.widget.framelayout;
import android.widget.linearlayout;

import java.lang.reflect.method;

/**
 * created by administrator on 2017/3/21.
 */
public class statusbarmanager {

  private static final int build_version_kitkat = 19;
  private static final int build_version_lollipop = 21;
  //windowmanager.layoutparams.flag_translucent_status
  public static final int flag_translucent_status = 0x04000000;
  //windowmanager.layoutparams.flag_draws_system_bar_backgrounds
  public static final int flag_draws_system_bar_backgrounds = 0x80000000;
  private activity mactivity;
  private view statusbarview;
  private int statusbarheight;

  //设置状态蓝的颜色值
  int color;

  public statusbarmanager(activity activity,int color) {
    this.mactivity = activity;
    this.color = color;
    statusbarheight = getstatusbarheight(activity);
  }
  public void setstatusbarview(view statusbarview) {
    this.statusbarview = statusbarview;
    settransparent();
  }
  public void setstatusbarview() {
    settransparent();
  }
  public int getstatusbarheight() {
    return statusbarheight;
  }
  /**
   * 设置状态栏全透明
   *
   */
  private void settransparent() {
    //4.0没有转太烂
    if (build.version.sdk_int < build_version_kitkat) {
      return;
    }
    if(statusbarheight <= 0){
      return;
    }

    transparentstatusbar();
    showstatusbarview();
  }
  @targetapi(19)
  private void showstatusbarview() {
    /**
     * 设置状态栏颜色的位置
     */
    if(statusbarview == null){
      statusbarview = new view(mactivity);
      linearlayout.layoutparams params = new linearlayout.layoutparams(viewgroup.layoutparams.match_parent,
          getstatusbarheight(mactivity));
      statusbarview.setlayoutparams(params);
      statusbarview.setbackgroundcolor(color);
      viewgroup decorview = (viewgroup) mactivity.getwindow().getdecorview();
      framelayout content = (framelayout) decorview.findviewbyid(android.r.id.content);
      framelayout.layoutparams layoutparams = (framelayout.layoutparams) content.getchildat(0).getlayoutparams();
      layoutparams.setmargins(0,statusbarheight,0,0);
      decorview.addview(statusbarview);
    }else{
      viewgroup.layoutparams layoutparams = statusbarview.getlayoutparams();
      layoutparams.height = getstatusbarheight(mactivity);
      statusbarview.setlayoutparams(layoutparams);
      statusbarview.setbackgroundcolor(color);
    }
  }

  /**
   * 参考上面注释掉的代码 因为需要用隐藏api 调用方式进行改成反射
   */
  private void transparentstatusbar(){
    window window = mactivity.getwindow();
    if (build.version.sdk_int >= build_version_lollipop) {
      //不add此条flag 会导致在emui3.1(华为)上失效,add这个flag 会导致在其它机型上面添加一个半透明黑条
      window.addflags(flag_translucent_status);
      //下面的代码段是不加上面的flag时,要显示纯色的状态栏时需要加的代码 不用了
/*      window.clearflags(flag_translucent_status);
      window.getdecorview().setsystemuivisibility(view.system_ui_flag_layout_fullscreen
          | view.system_ui_flag_layout_stable);
      window.addflags(flag_draws_system_bar_backgrounds);*/
      //因为需要用隐藏api,没有重新编译5.x版本的android.jar,使用的还是18的api,这里用的反射
      try {
        class[] argsclass=new class[]{int.class};
        method setstatusbarcolormethod = window.class.getmethod("setstatusbarcolor",argsclass);
        setstatusbarcolormethod.invoke(window, color.transparent);
      } catch (exception e) {
        e.printstacktrace();
      }
    }else{
      window.addflags(flag_translucent_status);
    }
  }
  /**
   * 获取状态栏高度
   *
   * @param context context
   * @return 状态栏高度
   */
  private static int getstatusbarheight(context context) {
    if (build.version.sdk_int < build_version_kitkat) {
      return 0;
    }
    // 获得状态栏高度
    int resourceid = context.getresources().getidentifier("status_bar_height", "dimen", "android");
    return context.getresources().getdimensionpixelsize(resourceid);
  }
  public void setstatusbarvisibility(int visibility){
    if(statusbarview != null) {
      this.statusbarview.setvisibility(visibility);
    }
  }
  public void setcolor(int color){
    if(statusbarview != null){
      this.statusbarview.setbackgroundcolor(color);
    }
  }



}

做了这些就可以自定义你的状态栏了,,,

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网