现在的很多app的状态栏的颜色A都设置的跟ActionBar颜色一样,这样看起来会比较舒服一些,也比较美观,不会觉得上面秃了一块,特别是强迫症患者。。

AlertDialog修改状态栏颜色 android android设置状态栏颜色_android

像图片这样。。看起来很不爽,所以就看看能不能设置成自己喜欢的颜色。然后就去搜一下关于这方面的知识,当然了,这方面的知识多的很。就是比较大众的设置方式一:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//因为不是所有的系统都可以设置颜色的,在4.4以下就不可以。。有的说4.1,所以在设置的时候要检查一下系统版本是否是4.1以上
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(getResources().getColor(R.color.action_color_blue));
        }



设置成功后的效果是这样的:

AlertDialog修改状态栏颜色 android android设置状态栏颜色_android_02

强迫症患者心里顿时舒服了许多。。。抱着这种心态我去试着搬到自己的工程里面发现 竟然不可以!!!!为啥不可以?因为我发现在我的Activity中没有这个设置StatusBar的函数!就是没有这个:

window.setStatusBarColor(getResources().getColor(R.color.action_color_blue));



然后我又发现了为啥不可以,就是因为我的工程继承的Activity不是Activity是FragmentActivity。。而Fragmentactivity这个类当中没有setStatusBarColor这个函数。我的Activity是这样的:

public class SmartBaseAactivity extends FragmentActivity {



那咋办!没有这种简单粗暴的方法了,然后赶紧去搜一搜有没有其他的方法。。这样一搞还真的有,也就是方法二:

其实就是把状态栏设置成透明,然后获取状态栏的高度,然后在视图的基础上添加一个跟状态栏登高的视图。完美。。

用图片的方式来说就是这样的,如果单纯的设置成状态栏透明的话,ActionBar会被顶上去,像这样:

AlertDialog修改状态栏颜色 android android设置状态栏颜色_android_03


这样也很尴尬。。但是至少状态栏变成了一样的颜色。。然后就可以在这个基础上加一个跟StatusBar登高的视图。

那现在问题来了,要咋加才能显得低调奢华不做作呢?!既然是继承于FragmentActivity上,那就可以从FragmentActivity入手!实现一个继承于Fragmentactivity的,然后在setContentView重写一下,把这个头通过这个函数添加进去!然后一点都不耽搁其他的界面啊!而且其他界面一个函数都不用加,跟这件事情完全没有发生过一样。。。以下就是我复写的Fragmentactivity类:

import android.os.Build;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;

public class BaseActivity extends FragmentActivity{
	private LinearLayout mBaseView;
	private View actionBar;
	@Override
	public void setContentView(int layoutResID) {
		mBaseView = (LinearLayout)LayoutInflater.from(this).inflate(R.layout.actionbar_main_layout, null);//状态栏
		LayoutInflater.from(this).inflate(layoutResID, mBaseView);	//把状态栏添加到主视图
		setContentView(mBaseView);
	}
	
	@Override
	public void setContentView(View view) {
		super.setContentView(view);
		initView();//设置状态栏的高度跟样式
	}
	private void initView() {
		//改变statusbar的颜色
		actionBar = mBaseView.findViewById(R.id.action_bar);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        	actionBar.setVisibility(ViewGroup.VISIBLE);
            Window w = getWindow();
            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,	//设置StatusBar透明
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            int id = 0;
            id = getResources().getIdentifier("status_bar_height", "dimen",	//获取状态栏的高度 
                    "android");
            if (id > 0) {
            	actionBar.getLayoutParams().height = getResources()	//设置状态栏的高度
                        .getDimensionPixelOffset(id);
            }
        }
	}
}



然后MainActivity还是跟原来的样子一样,只要继承于BaseActivity:

public class MainActivity extends BaseActivity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.okhttp_main);
	}
}



status_main_layout的布局如下:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <LinearLayout 
        android:id="@+id/action_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#11B7F3"
        >
    </LinearLayout>
</LinearLayout>



效果如下:

不放图了。。。看图二。。。