现在的很多app的状态栏的颜色A都设置的跟ActionBar颜色一样,这样看起来会比较舒服一些,也比较美观,不会觉得上面秃了一块,特别是强迫症患者。。
像图片这样。。看起来很不爽,所以就看看能不能设置成自己喜欢的颜色。然后就去搜一下关于这方面的知识,当然了,这方面的知识多的很。就是比较大众的设置方式一:
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));
}
设置成功后的效果是这样的:
强迫症患者心里顿时舒服了许多。。。抱着这种心态我去试着搬到自己的工程里面发现 竟然不可以!!!!为啥不可以?因为我发现在我的Activity中没有这个设置StatusBar的函数!就是没有这个:
window.setStatusBarColor(getResources().getColor(R.color.action_color_blue));
然后我又发现了为啥不可以,就是因为我的工程继承的Activity不是Activity是FragmentActivity。。而Fragmentactivity这个类当中没有setStatusBarColor这个函数。我的Activity是这样的:
public class SmartBaseAactivity extends FragmentActivity {
那咋办!没有这种简单粗暴的方法了,然后赶紧去搜一搜有没有其他的方法。。这样一搞还真的有,也就是方法二:
其实就是把状态栏设置成透明,然后获取状态栏的高度,然后在视图的基础上添加一个跟状态栏登高的视图。完美。。
用图片的方式来说就是这样的,如果单纯的设置成状态栏透明的话,ActionBar会被顶上去,像这样:
这样也很尴尬。。但是至少状态栏变成了一样的颜色。。然后就可以在这个基础上加一个跟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>
效果如下:
不放图了。。。看图二。。。