沉浸式是安卓5.0之后通知栏开始和IOS一样了,然而4.0还没有变成沉浸式。
这篇来说下如何实现沉浸式通知栏
我看了许多的沉浸式写法,自己在实现的时候,也用了自己的方法。
首先创建项目,把 AndroidManifest.xml 文件里的属性修改标题栏
android:theme="@android:style/Theme.Light.NoTitleBar"
在创建一个xml文件 upbar.xml 代码如下:
<?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="match_parent"
android:background="#4169E1"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="25dp" >
<TextView
android:id="@+id/upbar_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="name"
android:textColor="#fff"
android:textSize="20sp" />
<ImageView
android:id="@+id/upbar_Img1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:src="@drawable/back" />
<ImageView
android:id="@+id/upbar_Img2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/upbar_Img1"
android:src="@drawable/edit" />
</RelativeLayout>
</LinearLayout>
在创建一个class文件 继承与 FrameLayout类 用来实现upbar.xml 代码如下:
package com.example.customdemo;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
public class UpBar extends FrameLayout {
private IUpBarOnClickListener Img1listener;
private IUpBarOnClickListener Img2listener;
private IUpBarOnClickListener Titlelistener;
private ImageView mImg1;
private ImageView mImg2;
private TextView mTitle;
public UpBar(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.upbar, this);
initview();
OnClick();
}
private void OnClick() {
mImg1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (Img1listener != null) {
Img1listener.OnClick(arg0);
}
}
});
mImg2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (Img2listener != null) {
Img2listener.OnClick(arg0);
}
}
});
mTitle.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (Titlelistener != null) {
Titlelistener.OnClick(arg0);
}
}
});
}
private void initview() {
mImg1 = (ImageView) findViewById(R.id.upbar_Img1);
mImg2 = (ImageView) findViewById(R.id.upbar_Img2);
mTitle = (TextView) findViewById(R.id.upbar_name);
}
/***
* 设置子控件是否显示
* @param isShow
* @param v
*/
public void setChildVisibility(boolean isShow, View v){
if (isShow) {
v.setVisibility(VISIBLE);
}else{
v.setVisibility(INVISIBLE);
}
}
//设置监听事件
public void setImg1Listener(IUpBarOnClickListener listener){
Img1listener = listener;
}
public void setImg2Listener(IUpBarOnClickListener listener){
Img2listener = listener;
}
public void setTitleListener(IUpBarOnClickListener listener){
Titlelistener = listener;
}
public ImageView getmImg1() {
return mImg1;
}
public void setImg1ByRes(int resId) {
this.mImg1.setImageResource(resId);
}
public ImageView getmImg2() {
return mImg2;
}
public void setImg2ByRes(int resId) {
this.mImg2.setImageResource(resId);
}
public TextView getmTitle() {
return mTitle;
}
public void setTitleText(String text) {
this.mTitle.setText(text);
}
}
在MainActivity代码如下:
package com.example.customdemo;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;
public class MainActivity extends Activity {
private UpBar mUpbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setNotificationBar();
initupbar();
}
private void initupbar() {
mUpbar = (UpBar) findViewById(R.id.upBar1);
//设置title文字
mUpbar.setTitleText("首页");
//设置左边按钮不显示
mUpbar.setChildVisibility(false, mUpbar.getmImg1());
//设置右边按钮事件监听
mUpbar.setImg2Listener(new IUpBarOnClickListener() {
@Override
public void OnClick(View view) {
Toast.makeText(MainActivity.this, "我是右边按钮", Toast.LENGTH_SHORT).show();
}
});
}
/***
* 19以上版本取消标题栏
*/
@TargetApi(19)
private void setNotificationBar() {
if(VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
}
}
运行后的结果为:
点击按钮
其中核心的代码块为:
<span style="white-space:pre"> </span>/***
* 19以上版本取消标题栏
*/
@TargetApi(19)
private void setNotificationBar() {
if(VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
}
然后我使用创建一个自定义的upbar 结构图如下
我将relativelayout布局设置了一个属性
android:layout_marginTop="25dp"
25dp刚好是系统自带的状态栏的高度,我就是靠着一个upbar的自定义view覆盖掉原本系统的状态栏实现沉浸式模式
结语:
第一次写博客,算是个记录,也实现了沉浸式的状态栏,需要更好的沉浸式的状态栏 可以找大牛的看看!