android 狀態列顏色的兩種設定模式
阿新 • • 發佈:2019-02-11
現在的很多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>
效果如下:
不放圖了。。。看圖二。。。