一.5.0及以上實(shí)現(xiàn)沉浸式狀態(tài)欄
方式1:通過(guò)設(shè)置主題達(dá)到,狀態(tài)欄的顏色跟隨你的主題里面的colorPrimaryDark屬性。
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
方式2:通過(guò)代碼實(shí)現(xiàn)(只對(duì)API 21 及以上才能通過(guò)代碼實(shí)現(xiàn)),狀態(tài)欄顯示為紅色
getWindow().setStatusBarColor(Color.RED);
方式3:通過(guò)在主題中設(shè)置樣式屬性解決,
<item name="android:statusBarColor">@color/color_red</item>
二.4.4 小于android 5.0實(shí)現(xiàn)沉浸式狀態(tài)欄(小于4.4就不能實(shí)現(xiàn)),可以設(shè)置狀態(tài)欄為透明的
方式1:通過(guò)在主題中設(shè)置樣式屬性解決,(不推薦使用,兼容性不好)
<item name="android:windowTranslucentStatus">true</item>
方式2:在代碼里面解決,設(shè)置為透明的屬性(在布局文件中加入Toolbar)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
setContentView(R.layout.activity_main);
出現(xiàn)副作用: APP的內(nèi)容頂?shù)阶钌厦嫒チ诵懔猓礌顟B(tài)欄會(huì)遮擋一部分界 面翎苫。很坑 解決辦法(有幾種): 1)給Toolbar設(shè)置android:fitsSystemWindows="true" 該屬性的作用:設(shè)置布局時(shí),是否考慮當(dāng)前系統(tǒng)窗口的布局族吻,如果為true就會(huì)調(diào)整整個(gè)系統(tǒng)窗口 布局(包括狀態(tài)欄的view)以適應(yīng)你的布局捏境。但是又出現(xiàn)了一個(gè)bug,當(dāng)里面有ScrollView并且ScrollView里面有Edittext的時(shí)候峻村,就會(huì)出現(xiàn)軟鍵盤(pán)一彈起就會(huì)把toolbar拉下來(lái),很難看這種辦法有什么價(jià)值呢钠糊?如果里面沒(méi)有ScrollView就可以用挟秤。
解決辦法:給布局最外層容器設(shè)置android:fitsSystemWindows="true" 可以達(dá)到狀態(tài)欄透明,并且露出底色---android:windowBackground顏色眠蚂。
巧妙地解決:步驟:
1.在最外層容器設(shè)置android:fitsSystemWindows="true"
2.直接將最外層容器(也可以修改-android:windowBackground顏色)設(shè)置成狀態(tài)欄想要的顏色
3.下面剩下的布局再包裹一層正常的背景顏色
方式3:在布局文件中添加Toobar,修改Toolbar的高度,步驟:
1.不要給Toolbar設(shè)置android:fitsSystemWindows="true"
2.獲取狀態(tài)欄的高度.
源碼:
<!-- Height of the status bar -->
<dimen name="status_bar_height">24dp</dimen>
<!-- Height of the bottom navigation / system bar. -->
<dimen name="navigation_bar_height">48dp</dimen>
反射手機(jī)運(yùn)行的類(lèi)(R類(lèi)):android.R.dimen.status_bar_height.
3.在布局文件中添加Toobar,給Toolbar設(shè)置padding值
代碼:
public class MainActivity extends AppCompatActivity {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitleTextColor(Color.WHITE);
ViewGroup.LayoutParams params = toolbar.getLayoutParams();
params.height += getStatusBarHeight(this);
toolbar.setLayoutParams(params);
toolbar.setPadding(toolbar.getPaddingLeft(),
toolbar.getPaddingTop()+getStatusBarHeight(this),
toolbar.getPaddingRight(),
toolbar.getPaddingBottom()
);
}
private int getStatusBarHeight(Context context) {
int statusBarHeight = -1;
//反射手機(jī)運(yùn)行的類(lèi)(R類(lèi)):android.R.dimen.status_bar_height.
try {
Class<?> clazz = Class.forName("com.android.internal.R$dimen");
Object newInstance = clazz.newInstance();
String statusBarHeightStr = clazz.getField("status_bar_height").get(newInstance).toString();
//獲得status_bar_height的id
int id = Integer.parseInt(statusBarHeightStr);
//將DP變成px
statusBarHeight = context.getResources().getDimensionPixelSize(id);
} catch (Exception e) {
e.printStackTrace();
}
return statusBarHeight;
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
app:title="網(wǎng)易新聞"
android:background="@color/colorPrimaryDark"
android:layout_width="match_parent"
android:layout_height="?actionBarSize">
</android.support.v7.widget.Toolbar>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
</LinearLayout>
BaseActivity的封裝:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT <Build.VERSION_CODES.LOLLIPOP){
//在[4.4 , 5.0)設(shè)置狀態(tài)欄為透明
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
super.onCreate(savedInstanceState);
}
public void setOrChangeTransluentBar(Toolbar toolbar,int statusBarColor){
toolbar.setBackgroundColor(statusBarColor);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT <Build.VERSION_CODES.LOLLIPOP){
//在[4.4 , 5.0)設(shè)置狀態(tài)欄為透明
ViewGroup.LayoutParams params = toolbar.getLayoutParams();
params.height += getStatusBarHeight(this);
toolbar.setLayoutParams(params);
toolbar.setPadding(toolbar.getPaddingLeft(),
toolbar.getPaddingTop()+getStatusBarHeight(this),
toolbar.getPaddingRight(),
toolbar.getPaddingBottom()
);
}
}
private int getStatusBarHeight(Context context) {
int statusBarHeight = -1;
//反射手機(jī)運(yùn)行的類(lèi)(R類(lèi)):android.R.dimen.status_bar_height.
try {
Class<?> clazz = Class.forName("com.android.internal.R$dimen");
Object newInstance = clazz.newInstance();
String statusBarHeightStr = clazz.getField("status_bar_height").get(newInstance).toString();
//獲得status_bar_height的id
int id = Integer.parseInt(statusBarHeightStr);
//將DP變成px
statusBarHeight = context.getResources().getDimensionPixelSize(id);
} catch (Exception e) {
e.printStackTrace();
}
return statusBarHeight;
}
}
主題:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
在4.4上運(yùn)行效果圖:
在6.0上運(yùn)行效果圖