欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-11-20 17:36:46
android 状态栏的设置适配问题详解 最近看了很多关于状态栏的问题的处理,总结出处理状态栏分两个方向1>5.0一下2>5.0以上的手机状态栏的设置,,,,...

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文件,结构如图

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

置于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);
    }
  }



}

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