安卓4.0通知栏沉浸式写法+自定义标题栏设置

来源:互联网 发布:知柏地黄丸主治 编辑:程序博客网 时间:2024/06/05 15:30

沉浸式是安卓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() {@Overridepublic void onClick(View arg0) {if (Img1listener != null) {Img1listener.OnClick(arg0);}}});mImg2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {if (Img2listener != null) {Img2listener.OnClick(arg0);}}});mTitle.setOnClickListener(new OnClickListener() {@Overridepublic 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;@Overrideprotected 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() {@Overridepublic 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覆盖掉原本系统的状态栏实现沉浸式模式


结语:

第一次写博客,算是个记录,也实现了沉浸式的状态栏,需要更好的沉浸式的状态栏 可以找大牛的看看!


1 0
原创粉丝点击