1. 程式人生 > >android 狀態列顏色的兩種設定模式

android 狀態列顏色的兩種設定模式

現在的很多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>

效果如下:

不放圖了。。。看圖二。。。