Android——8种通知栏-超简单自定义

22 篇文章 8 订阅
订阅专栏

GT库在很早的版本里就有出 通知栏封装方法,但使用起来非常有局限性,接下来咋们来看看新版GT库里的8种通知栏,是如何实现的。

通知栏效果图:(博主真机 一加10T pro  Android版本14)

    

 

目录

通知栏效果图:(博主真机 一加10T pro  Adnroid版本12)

使用GT库里的,当然需要先依赖好GT库啦:

第一种:最为常见的 普通 通知栏

第二种:大图 通知栏

第三种:长文本 通知栏

第四种:长文本条 通知栏

第五种:消息 通知栏

第六种:进度条 通知栏

第七种:简易 自定义通知栏

第八种:完全 自定义通知栏 (轻松定制音乐播放器~~~重磅来袭!!!)

学会了这些,今后定制啥通知栏,还不  上手就来~~~

自定义 定制音乐播放器 整体源码:


使用GT库里的,当然需要先依赖好GT库啦:

GitHub - 1079374315/GTContribute to 1079374315/GT development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/1079374315/GT

注意!!!Android13及以上需要以下权限步骤,

权限步骤1:加入通知栏权限:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

权限步骤2动态申请通知栏权限 代码:

    //判断是否拥有权限
    if(!GT.AppAuthorityManagement.areNotificationsEnabled(MainActivity.this)){
        //没有权限,前去申请权限
        GT.AppAuthorityManagement.requestNotificationsPermission(MainActivity.this);
    }else{
        //拥有权限,直接启动 自定义通知栏
         
    }

权限步骤3(非必要步骤):如果需要引导用户开启 悬浮通知栏(类似于微信消息弹窗) 可以直接加入以下代码跳转权限页:

GT.AppAuthorityManagement.openNotificationSettingsForApp(context);

下面我们来正文,重头戏是最后一种通知栏 “完全自定义通知栏”

第一种:最为常见的 普通 通知栏

实现代码:

 里面有个 是否直接启动的 参数,如果填 true,创建就会自动启动通知栏,如果填 false ,就还可以自定义属性,类似于这样:

NotificationCompat.Builder builder = GT.GT_Notification.createNotificationForNormal(
                        JavaActivity.this,
                        com.gsls.gt.R.mipmap.gt_logo,//通知栏图标
                        com.gsls.gt.R.mipmap.gt_logo,//通知栏 右下角图片
                        "通知栏标题",//通知栏标题
                        //通知栏内容
                        "1.GT库在很早的版本里就有出 " +
                                "通知栏封装方法,但使用起来非常有局限性," +
                                "接下来咋们来看看新版GT库里的8种通知栏,是如何实现的",
                        true,//通知栏单击是否自动取消
                        true,//锁屏后是否弹出
                        new Intent(JavaActivity.this, MainActivity.class),//单击跳转的页面
                        0,//发送通知栏的时间
                        true,//是否 直接启动通知栏
                        222//当前通知的 Id编号
                );

                GT.GT_Notification.startNotification(builder,222);

第二种:大图 通知栏

实现代码:

//创建大图通知栏
        NotificationCompat.Builder notificationImg = GT.GT_Notification.createNotificationImg(
                this,
                R.mipmap.gt_logo,//通知栏图标
                R.drawable.aaa,//通知栏 右下角图片
                R.drawable.eee,//通知栏大图
                "大图通知标题",//通知栏标题
                "我的内容",//通知栏内容
                true,//是否单击后取消通知
                true,//是否锁屏弹出
                new Intent(this, MainActivity.class),//单击意图
                -1//发送通知栏时间
        );

        //启动最终的通知栏
        GT.GT_Notification.startNotification(notificationImg, 222);

如果你不想右上角有图片可以这么写:

//启动大图通知栏
        NotificationCompat.Builder notificationImg = GT.GT_Notification.createNotificationImg(
                this,
                -1,//取消通知栏图片
                -1,//取消通知栏右下角图片
                R.drawable.eee,//通知栏大图
                "大图通知标题",//通知栏标题
                "我的内容",//通知栏内容
                true,//是否单击后取消通知
                true,//是否锁屏弹出
                new Intent(this, MainActivity.class),//单击意图
                -1,//发送通知栏时间
                222//通知栏编号ID
        );

        GT.GT_Notification.startNotification(notificationImg, 222);

效果图:

是不是使用起来很简单~

第三种:长文本 通知栏

 实现代码:

//创建长文字通知栏
        NotificationCompat.Builder notificationImg =
                GT.GT_Notification.createNotificationText(
                this,
                R.mipmap.gt_logo,//通知栏图标
                R.drawable.aaa,//通知栏 右下角图片
                "大图通知标题",//通知栏标题
                "GT库在很早的版本里就有出 通知栏封装方法,但使用起来非常有局限性," +
                        "接下来咋们来看看新版GT库里的8种通知栏,是如何实现的。" +
                        "GT库目前总共封装了8种通知栏,每一个通知栏使用起来都特别简单的," +
                        "最主要的还支持完全自定义通知栏。\nGT库不止这一个好用的库~",
                true,//是否单击后取消通知
                true,//是否锁屏弹出
                new Intent(this, MainActivity.class),//单击意图
                -1//发送通知栏时间
        );

        //启动最终的通知栏
        GT.GT_Notification.startNotification(notificationImg, 222);

第四种:长文本条 通知栏

 实现代码:

//创建长文字通知栏
        NotificationCompat.Builder notificationImg =
                GT.GT_Notification.createNotificationTexts(
                        this,
                        R.mipmap.gt_logo,//通知栏图标
                        R.drawable.aaa,//通知栏 右下角图片
                        "大图通知标题",//通知栏标题
                        false,//是否单击后取消通知
                        true,//是否锁屏弹出
                        new Intent(this, MainActivity.class),//单击意图
                        -1,//发送通知栏时间
                        222,
                        "1.GT库在很早的版本里就有出",
                        "2.通知栏封装方法,但使用起来非常有局限性",
                        "3.接下来咋们来看看新版GT库里的8种通知栏"
                );

        //启动最终的通知栏
        GT.GT_Notification.startNotification(notificationImg, 222);

目前我们是直接在创建的时候就添加了3条文本,如果我们想创建后添加并更新通知栏UI怎么做呢?我们可以这么操作:

//创建长文字通知栏
        NotificationCompat.Builder notificationImg =
                GT.GT_Notification.createNotificationTexts(
                        this,
                        R.mipmap.gt_logo,//通知栏图标
                        R.drawable.aaa,//通知栏 右下角图片
                        "大图通知标题",//通知栏标题
                        false,//是否单击后取消通知
                        true,//是否锁屏弹出
                        new Intent(this, MainActivity.class),//单击意图
                        -1,//发送通知栏时间
                        222,
                        "1.GT库在很早的版本里就有出",
                        "2.通知栏封装方法,但使用起来非常有局限性",
                        "3.接下来咋们来看看新版GT库里的8种通知栏"
                );

        //启动最终的通知栏
        GT.GT_Notification.startNotification(notificationImg, 222);

        //创建后动态添加文本
        GT.GT_Notification.addLineText(notificationImg,222,
                "4.GT库目前总共封装了8种通知栏,",
                "5.每一个通知栏使用起来都特别简单的,",
                "6.最主要的还支持完全自定义通知栏。",
                "7.GT库不止这一个好用的库~"
                );

        //更新最终修改的通知栏
        GT.GT_Notification.startNotification(notificationImg, 222);

效果图:

第五种:消息 通知栏

 

 实现代码:

//创建消息通知栏
        NotificationCompat.Builder notificationImg =
                GT.GT_Notification.createNotificationMsgs(
                        this,
                        R.mipmap.gt_logo,//通知栏图标
                        -1,//通知栏 右下角图片
                        "大图通知标题",//通知栏标题
                        false,//是否单击后取消通知
                        true,//是否锁屏弹出
                        new Intent(this, MainActivity.class),//单击意图
                        -1,//发送通知栏时间
                        222,
                        "王重阳" + GT.GT_Notification.SEPARATOR + "大清早是习武最好的时间!",
                        "郭靖" + GT.GT_Notification.SEPARATOR + "前辈的武功真是登峰造极呀!",
                        "周伯通" + GT.GT_Notification.SEPARATOR + "练武有什么好玩的",
                        "周伯通" + GT.GT_Notification.SEPARATOR + "大兄弟,你来啦!快来看看我这秀字的蜜蜂"

                );

        //启动最终的通知栏
        GT.GT_Notification.startNotification(notificationImg, 222);

注意:GT.GT_Notification.SEPARATOR 字段是消息的分隔符,一定要用这个用于区分。

当然,消息通知栏也支持创建后再动态添加消息:

//创建消息通知栏
        NotificationCompat.Builder notificationImg =
                GT.GT_Notification.createNotificationMsgs(
                        this,
                        R.mipmap.gt_logo,//通知栏图标
                        -1,//通知栏 右下角图片
                        "大图通知标题",//通知栏标题
                        false,//是否单击后取消通知
                        true,//是否锁屏弹出
                        new Intent(this, MainActivity.class),//单击意图
                        -1,//发送通知栏时间
                        222,
                        "王重阳" + GT.GT_Notification.SEPARATOR + "大清早是习武最好的时间!",
                        "郭靖" + GT.GT_Notification.SEPARATOR + "前辈的武功真是登峰造极呀!",
                        "周伯通" + GT.GT_Notification.SEPARATOR + "练武有什么好玩的",
                        "周伯通" + GT.GT_Notification.SEPARATOR + "大兄弟,你来啦!快来看看我这秀字的蜜蜂"

                );

        //启动最终的通知栏
        GT.GT_Notification.startNotification(notificationImg, 222);


        //创建后动态添加消息
        GT.GT_Notification.addLineMsg(notificationImg,222,
                "郭靖" + GT.GT_Notification.SEPARATOR + "我不玩,华山论剑就只剩下2年了,我要继续加油。",
                "周伯通" + GT.GT_Notification.SEPARATOR + "华山论剑有什么好玩的,你不陪我玩,那我找小黄蓉玩去了。",
                "黄蓉" + GT.GT_Notification.SEPARATOR + "老顽童!真是调皮,别去打扰靖哥哥习武了!",
                "黄蓉" + GT.GT_Notification.SEPARATOR + "走!我带你尝尝我最新研究出来的菜品!"
                );

        //更新最终修改的通知栏
        GT.GT_Notification.startNotification(notificationImg, 222);

效果图:

 注意:发送的消息通知栏里是会有显示限制的。

第六种:进度条 通知栏

 实现代码:

//创建进度条知栏
        NotificationCompat.Builder builder =
                GT.GT_Notification.createNotificationProgress(
                        this,
                        R.mipmap.gt_logo,//通知栏图标
                        R.drawable.aaa,
                        "检测到最新版本",
                        "正在更新中,请稍后...",
                        false,//单击后是否自动隐藏
                        true,//是否会悬浮状态展示
                        true,//锁屏是否显示
                        new Intent(this, MainActivity.class),//单击意图
                        -1,//发送通知时间
                        100,//进度最大值
                        0//当前进度
                );

        //启动最终的通知栏
        GT.GT_Notification.startNotification(builder, 222);

既然是进度条,那么怎么更新进度条呢,没错,更新进度条方法也是特别简单:

//创建进度条知栏
        NotificationCompat.Builder builder =
                GT.GT_Notification.createNotificationProgress(
                        this,
                        R.mipmap.gt_logo,//通知栏图标
                        R.drawable.aaa,
                        "检测到最新版本",
                        "正在更新中,请稍后...",
                        false,//单击后是否自动隐藏
                        true,//是否会悬浮状态展示
                        true,//锁屏是否显示
                        new Intent(this, MainActivity.class),//单击意图
                        -1,//发送通知时间
                        100,//进度最大值
                        0//当前进度
                );

        //启动最终的通知栏
        GT.GT_Notification.startNotification(builder, 222);

        //模拟网络下载
        new Thread(new Runnable() {
            @Override
            public void run() {

                for (int progress = 0; progress <= 100; progress++) {
                    GT.Thread.sleep(50);//GT库的延迟函数,模拟网络下载的速度
                    GT.GT_Notification.updateNotificationProgress(
                            builder,//修改该进度条通知栏的进度
                            "正在下载中..." + progress + "%",//进度显示
                            100,//进度条最大值
                            progress,//进度条当前进度
                            true,//是否隐藏在通知栏里进行更新进度
                            true,//完成后是否自动隐藏
                            "下载完毕,正在安装中!",//完成后显示的文字
                            3000,//完成后等待3秒后取消通知
                            222//通知栏 编号ID
                    );
                }

            }
        }).start();

效果图:

总结:这个使用起来 与 更新起来 方便吧,把建议都打在评论区吧~~

第七种:简易 自定义通知栏

 实现代码:

//创建进自定义知栏
        NotificationCompat.Builder builder =
                GT.GT_Notification.createNotificationFoldView(
                        this,
                        R.mipmap.gt_logo,//通知栏图标
                        R.layout.item_notification,//折叠布局
                        R.layout.item_notification2,//展开布局
                        true,//单击是否取消通知
                        true,//是锁屏显示
                        new Intent(this, MainActivity.class),//单击意图
                        -1,//发送通知时间
                        222//通知Id
                );

        //启动最终的通知栏
        GT.GT_Notification.startNotification(builder, 222);

折叠布局:R.layout.item_notification

<?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:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv_head"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:scaleType="fitXY"
            />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:layout_weight="1"
            android:orientation="vertical">

            <TextView
                android:id="@+id/Notification2Activity_music_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="单击我 触发事件"
                android:textColor="#000000"
                android:textSize="16sp" />

            <TextView
                android:id="@+id/tv_author"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="歌手名:周杰伦"
                android:textSize="12sp"
                android:textColor="#000000" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:padding="10dp">

            <ImageButton
                android:id="@+id/ib_left"
                android:layout_width="26dp"
                android:layout_height="26dp"
                android:background="@null"
                android:scaleType="fitCenter"
                />

            <ImageButton
                android:id="@+id/ib_PauseRestore"
                android:layout_width="26dp"
                android:layout_height="26dp"
                android:layout_marginStart="10dp"
                android:background="@null"
                android:scaleType="fitCenter"
                />

            <ImageButton
                android:id="@+id/ib_right"
                android:layout_width="26dp"
                android:layout_height="26dp"
                android:layout_marginStart="10dp"
                android:background="@null"
                android:scaleType="fitCenter"
                />
        </LinearLayout>

    </LinearLayout>

</LinearLayout>

展开布局:R.layout.item_notification2

<?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:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv_head"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:scaleType="fitXY"
            />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:layout_weight="1"
            android:orientation="vertical">

            <TextView
                android:id="@+id/music_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="单击我 触发事件"
                android:textColor="#000000"
                />

            <TextView
                android:id="@+id/tv_author"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="歌手名:周杰伦"
                android:textSize="12sp"
                android:textColor="#000000" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:padding="10dp">

            <ImageButton
                android:id="@+id/ib_left"
                android:layout_width="26dp"
                android:layout_height="26dp"
                android:background="@null"
                android:scaleType="fitCenter"
                />

            <ImageButton
                android:id="@+id/ib_PauseRestore"
                android:layout_width="26dp"
                android:layout_height="26dp"
                android:layout_marginStart="10dp"
                android:background="@null"
                android:scaleType="fitCenter"
                />

            <ImageButton
                android:id="@+id/ib_right"
                android:layout_width="26dp"
                android:layout_height="26dp"
                android:layout_marginStart="10dp"
                android:background="@null"
                android:scaleType="fitCenter"
                />
        </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="110dp"
            android:scaleType="fitXY"
            />

    </LinearLayout>

</LinearLayout>

所用到的资源图片:

注意:目前自定义通知栏,无法实现  切换歌曲,暂停歌曲,只能单击后直接跳转到 相应的Activity中而已,想要真正的实现这些单击切换音乐、暂停音乐功能,

请看最后一种方法,“完全自定义通知栏”。

下面博主用了 第四版 加载布局,各位也要添加哦

 供复制:

//注册 gt-DataBinding 功能
annotationProcessor 'com.github.1079374315:GSLS_Tool:v1.4.4.9'

将红色框框里的复制粘贴注册好就可以使用第四版 加载布局了

第八种:完全 自定义通知栏 (轻松定制音乐播放器~~~重磅来袭!!!)

为了降低GIF大小,所有录制的GIF有点模糊,但实际效果是静态图这般。

 权限步骤1:加入网络权限(用于下载网图):

<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

实现基础代码:(去掉所有逻辑,仅仅保留UI层面的东西,为了让伙伴们更好的理解)

//加载 折叠通知栏 与 展开通知栏
@GT.Annotations.GT_Notification(value = R.layout.item_notification, value2 = R.layout.item_notification2)
public class NotificationDemo extends GT.GT_Notification.AnnotationNotification {

    //必要的重写 构造方法
    public NotificationDemo(Context context) {
        super(context);
    }

    @Override
    protected void initView(Context context) {
        super.initView(context);
        //初始化通知栏 必要属性
        setInitData(
                R.mipmap.gt_logo, //设置通知图标
                false,//单击是否取消通知
                true,//锁屏是否显示
                true,//是否用户不可取消通知
                null,//单击意图
                -1,//发送通知时间
                222);//通知栏编号Id
    }

}

建议 发布通知栏 代码:

    //创建通知栏
    NotificationDemo notificationDemo = new NotificationDemo(this);
    GT.GT_Notification.startNotification(notificationDemo);//发送通知栏

还有另一种 发布通知栏 代码:(如果你确定不需要再自定义什么了,就可以使用这种简短的方式)

//创建并发布 通知栏
new NotificationDemo(this).commit();

够简短吧!xml布局用的是 简易 自定义通知栏 里的 折叠布局展开布局 可直接从上面复制下来即可。GT库为简单而生

目前咋们这点代码写的音乐播放器,运行起来仅仅是个丑不拉几的静态UI,效果图如下:

 接下来咋们来各个设置上默认的美术图片:

//加载 折叠通知栏 与 展开通知栏
@GT.Annotations.GT_Notification(value = R.layout.item_notification, value2 = R.layout.item_notification2)
public class NotificationDemo extends GT.GT_Notification.AnnotationNotification {

    //必要的重写 构造方法
    public NotificationDemo(Context context) {
        super(context);
    }

    //重写必要的初始化方法
    @Override
    protected void initView(Context context) {
        super.initView(context);
        //初始化通知栏 必要属性
        setInitData(
                R.mipmap.gt_logo, //设置通知图标
                false,//单击是否取消通知
                true,//锁屏是否显示
                true,//是否用户不可取消通知
                null,//单击意图
                -1,//发送通知时间
                222);//通知栏编号Id

        //初始化UI属性(博主建议:在初始化UI里的尽量使用本地资源)
        setImageRes(R.id.iv_head, R.drawable.music_head);//设置头像图片
        setImageRes(R.id.iv_main2, R.drawable.ic_main2);//设置展开的解释图
        setTextViewText(R.id.tv_name, "歌曲名:最伟大的作品");//设置歌曲名
        setTextViewText(R.id.tv_author, "歌手名:周杰伦");//设置歌手

        //设置网络图片(当然也是可以在初始化UI里设置网络资源的,可以自行解开注释看看效果)
//        setImageUrl(R.id.ib_left, "http://t13.baidu.com/it/u=2287545062,2949645413&fm=224&app=112&f=JPEG?w=500&h=499");
        
    }

}

此时运行效果图:

 此时效果图,就有点儿 美哒哒了,注意:必须要使用GT库封装好的API去设置资源  不然在频繁更新网络图会遇见大坑。(要么全使用 GT库API去设置资源,要么全部使用系统封装的 API)  

如果使用系统原生的设置资源就可以这样:(若使用系统原生提供的,后续在频繁更新网络图会有问题)

        //初始化 折叠 UI属性(使用系统原生设置资源)
        remoteViews1.setImageViewResource(R.id.iv_head,R.drawable.music_head);
        remoteViews1.setImageViewResource(R.id.iv_main2,R.drawable.ic_main2);
        remoteViews1.setTextViewText(R.id.tv_name,"歌曲名:最伟大的作品");
        remoteViews1.setTextViewText(R.id.tv_author,"歌手名:周杰伦");
        //初始化 展开 UI属性
        remoteViews2.setImageViewResource(R.id.iv_head,R.drawable.music_head);
        remoteViews2.setImageViewResource(R.id.iv_main2,R.drawable.ic_main2);
        remoteViews2.setTextViewText(R.id.tv_name,"歌曲名:最伟大的作品");
        remoteViews2.setTextViewText(R.id.tv_author,"歌手名:周杰伦");

使用系统原生的一般都要设置两份代码,因为一份布局 remoteViews1 是折叠布局的,另一份布局 remoteViews2 是展开布局的。

此时的 音乐播放器 做的已经是有模有样了,接下来该怎么切换歌曲,暂停歌曲呢?

相信看过其他博主写的 通知栏教程的朋友们肯定会知道有这么一个方法

先是一个个添加Intent 的活动标识,然后再通过发送广播的方式进行实现单击切换歌曲

 这样确实是可以做到切换歌曲的功能,但要是把这些添加到GT库里来,博主第一个会奔溃,尤其是 通知栏稍微复杂点的,会让今后的代码及其难以维护。我们来看看GT库是怎么解决这一问题的。

GT库 实现的单击事件:

//加载 折叠通知栏 与 展开通知栏
@GT.Annotations.GT_Notification(value = R.layout.item_notification, value2 = R.layout.item_notification2)
public class NotificationDemo extends GT.GT_Notification.AnnotationNotification {

    //必要的重写 构造方法
    public NotificationDemo(Context context) {
        super(context);
    }

    //重写必要的初始化方法
    @Override
    protected void initView(Context context) {
        super.initView(context);
        //初始化通知栏 必要属性
        setInitData(
                R.mipmap.gt_logo, //设置通知图标
                false,//单击是否取消通知
                true,//锁屏是否显示
                true,//是否用户不可取消通知
                null,//单击意图
                -1,//发送通知时间
                222);//通知栏编号Id

        //初始化UI属性(博主建议:在初始化UI里的尽量使用本地资源)
        setImageRes(R.id.iv_head, R.drawable.music_head);//设置头像图片
        setImageRes(R.id.iv_main2, R.drawable.ic_main2);//设置展开的解释图
        setTextViewText(R.id.tv_name, "歌曲名:最伟大的作品");//设置歌曲名
        setTextViewText(R.id.tv_author, "歌手名:周杰伦");//设置歌手
    }

    //重写单击方法,实现单击事件
    @GT.Annotations.GT_Click({R.id.ib_left, R.id.ib_PauseRestore, R.id.ib_right})
    public void onClick(View view) {
        super.onClick(view);
        switch (view.getId()) {
            case R.id.ib_left://上一首
                GT.logt("上一首");
                break;
            case R.id.ib_PauseRestore://暂停/恢复
                GT.logt("暂停/恢复");
                break;
            case R.id.ib_right://下一首
                GT.logt("下一首");
                break;
        }
    }
}

 哦呦呦,这代码熟悉不,如果去掉 @GT.Annotations.GT_Click 注解,那你肯定会直接秒懂这代码,怕不就是直接在xml布局中 onClick 设置的单击事件吧。重写一个单击方法后只需要将你想要单击的组件注入注解中,再在下面的 switch 语句中写好执行的逻辑,整个单击事件就完成了。

接下来,你运行起来,再单击里面的切换歌曲/暂停恢复这些功能,就都有了反应。

接下来我们再来学习最后一个环节,暂停音乐 与 恢复音乐 音乐功能

GT库封装的通知栏设置布局,其实规则类似于 事务提交一样的方式去设计的,怎么理解呢,我们到实际代码中去看看。

    private boolean isPause = false;//暂停状态

    //重写单击方法,实现单击事件
    @GT.Annotations.GT_Click({R.id.ib_left, R.id.ib_PauseRestore, R.id.ib_right})
    public void onClick(View view) {
        super.onClick(view);
        switch (view.getId()) {
            case R.id.ib_left://上一首
                GT.logt("上一首");
                break;
            case R.id.ib_PauseRestore://暂停/恢复
                GT.logt("暂停/恢复");
                if (isPause) {
                    isPause = false;
                    GT.logt("点击了暂停");
                    setTextViewText(R.id.tv_name, "暂停");//设置 歌曲名为 暂停
                } else {
                    isPause = true;
                    GT.logt("点击了恢复");
                    setTextViewText(R.id.tv_name, "恢复");//设置 歌曲名为 恢复
                }
                break;
            case R.id.ib_right://下一首
                GT.logt("下一首");
                break;
        }
    }

我们在单击事件中加入了一个 boolean 值用来存储 暂停恢复状态,然后没点击暂停或恢复就设置 歌曲名文本显示为 暂停或恢复 文字,其实这段代码是 设置无效的 因为他虽然确实是设置了但没有去提交事务,所以并不会真正的让UI更新。想让UI设置起效,必须要在每次设置的最后加上一个 commit(); 方法进行提交事务进行更新。

如这样:

private boolean isPause = false;//暂停状态
    //重写单击方法,实现单击事件
    @GT.Annotations.GT_Click({R.id.ib_left, R.id.ib_PauseRestore, R.id.ib_right})
    public void onClick(View view) {
        super.onClick(view);
        switch (view.getId()) {
            case R.id.ib_left://上一首
                GT.logt("上一首");
                break;
            case R.id.ib_PauseRestore://暂停/恢复
                GT.logt("暂停/恢复");
                if (isPause) {
                    isPause = false;
                    GT.logt("点击了暂停");
                    //设置 歌曲名为 暂停 并提交事务更新UI
                    setTextViewText(R.id.tv_name, "暂停").commit();
                } else {
                    isPause = true;
                    GT.logt("点击了恢复");
                    //设置 歌曲名为 恢复 并提交事务更新UI
                    setTextViewText(R.id.tv_name, "恢复").commit();
                }
                break;
            case R.id.ib_right://下一首
                GT.logt("下一首");
                break;
        }
    }

那为啥之前咋们在 初始化 方法里就不需要写 commit(); 去提交事务更新UI呢?

第一种,发布通知方法,会默认提交更新

    //创建通知栏
    NotificationDemo notificationDemo = new NotificationDemo(this);
    GT.GT_Notification.startNotification(notificationDemo);//发送通知栏

第二种,创建这个通知栏的时候,后面写了一个 commit(); 提交更新方法

//创建并发布 通知栏
new NotificationDemo(this).commit();

所以咋们在写切换 暂停  与 恢复 图片切换的时候,就可以这么写:

private boolean isPause = false;//暂停状态
    //重写单击方法,实现单击事件
    @GT.Annotations.GT_Click({R.id.ib_left, R.id.ib_PauseRestore, R.id.ib_right})
    public void onClick(View view) {
        super.onClick(view);
        switch (view.getId()) {
            case R.id.ib_left://上一首
                GT.logt("上一首");
                break;
            case R.id.ib_PauseRestore://暂停/恢复
                GT.logt("暂停/恢复");
                if (isPause) {
                    isPause = false;
                    GT.logt("点击了暂停");
                    //设置 歌曲名为 暂停 并提交事务更新UI
                    setTextViewText(R.id.tv_name, "暂停");
                    setImageRes(R.id.ib_PauseRestore, R.drawable.music_play)
                            .commit();//提交事务进行更新UI
                } else {
                    isPause = true;
                    GT.logt("点击了恢复");
                    //设置 歌曲名为 恢复 并提交事务更新UI
                    setTextViewText(R.id.tv_name, "恢复");
                    setImageRes(R.id.ib_PauseRestore, R.drawable.music_pause)
                            .commit();//提交事务进行更新UI
                }
                break;
            case R.id.ib_right://下一首
                GT.logt("下一首");
                //finish();    //关闭当前通知栏
                break;
        }
    }

此时加上这个,你的暂停 与 恢复功能就可以高兴的使用了,接下来就是一些其他的音乐播放器 处理逻辑了,博主不再详细介绍,直接下面贴出整个源码,

学会了这些,今后定制啥通知栏,还不  上手就来~~~

自定义 定制音乐播放器 整体源码:

//加载 折叠通知栏 与 展开通知栏
@GT.Annotations.GT_Notification(value = R.layout.item_notification, value2 = R.layout.item_notification2)
public class NotificationDemo extends GT.GT_Notification.AnnotationNotification {

    //必要的重写 构造方法
    public NotificationDemo(Context context) {
        super(context);
    }

    private static List<String> urlList = new ArrayList<>();

    //重写必要的初始化方法
    @Override
    protected void initView(Context context) {
        super.initView(context);
        //初始化通知栏 必要属性
        setInitData(
                R.mipmap.gt_logo, //设置通知图标
                false,//单击是否取消通知
                true,//锁屏是否显示
                true,//是否用户不可取消通知
                null,//单击意图
                -1,//发送通知时间
                222);//通知栏编号Id

        //初始化UI属性(博主建议:在初始化UI里的尽量使用本地资源)
        setImageRes(R.id.iv_head, R.drawable.music_head);//设置头像图片
        setImageRes(R.id.iv_main2, R.drawable.ic_main2);//设置展开的解释图
        setTextViewText(R.id.tv_name, "歌曲名:最伟大的作品");//设置歌曲名
        setTextViewText(R.id.tv_author, "歌手名:周杰伦");//设置歌手


        //添加要切换的网图,模拟后台数据集
        urlList.add("http://t13.baidu.com/it/u=2287545062,2949645413&fm=224&app=112&f=JPEG?w=500&h=499");
        urlList.add("http://t15.baidu.com/it/u=4211663368,2899541822&fm=224&app=112&f=JPEG?w=500&h=500");
        urlList.add("https://pics0.baidu.com/feed/3ac79f3df8dcd10005cb97e31d637c17bb122f88.jpeg?token=78ac62753e80c3ef5412d819fcccbc79");
        urlList.add("https://pics3.baidu.com/feed/2e2eb9389b504fc23061ab7576c6381790ef6da2.jpeg?token=8216bfa1363a0759d3bbdc25cb374375");
        //后续可自行添加 网图

    }

    private boolean isPause = false;//暂停状态
    private int page = 0;
    //重写单击方法
    @GT.Annotations.GT_Click({R.id.ib_left, R.id.ib_PauseRestore, R.id.ib_right})
    public void onClick(View view) {
        super.onClick(view);
        switch (view.getId()) {
            case R.id.ib_left://上一首
                GT.toast("上一首");
                --page;
                if(page < 0){
                    page = 0;
                    return;
                }
                setTextViewText(R.id.tv_name, "上一首");
                setImageUrl(R.id.iv_head, urlList.get(page)).commit();
                break;
            case R.id.ib_PauseRestore://暂停/恢复
                if (isPause) {
                    isPause = false;
                    setTextViewText(R.id.tv_name, "暂停");
                    setImageRes(R.id.ib_PauseRestore, R.drawable.music_play)
                            .commit();
                } else {
                    isPause = true;
                    setTextViewText(R.id.tv_name, "恢复");
                    setImageRes(R.id.ib_PauseRestore, R.drawable.music_pause)
                            .commit();
                }
                break;
            case R.id.ib_right://下一首
                GT.toast("下一首");
                ++page;
                if(page > urlList.size()-1){
                    page = urlList.size()-1;
                    return;
                }
                setTextViewText(R.id.tv_name, "下一首");
                setImageUrl(R.id.iv_head, urlList.get(page)).commit();
                break;
        }
    }
}

满满干货,本文总字数 好了,又要秃了,拜了个拜~~~

补充其他API:

//常用API

cancelNotification(int notifyids);//删除指定通知

emptyNotification(); //清空所有通知

点个关注点个赞呗(〃'▽'〃)   关注博主最新发布库: GitHub - 1079374315/GT

Android Notification通知、点击事件、悬浮通知简单实现
Android_小黑
12-11 6573
Notification的三要素 1.小图标 .setSmallIcon() 2.标题 .setContentTitle() 3.内容 .setContentText() 这是一个通知的 三要素 有了三要素你的通知才能显示出来 一些常用的方法 方法 效果 .setSmallIcon() 小图标 .setContentTitle() 标题 .s...
Android自定义通知显示
wangzunkuan的博客
03-09 8531
概述 本文主要想说一下android项目开发中经常会使用到通知机制中的通知框架(Notificaiton)。通知位于设备的顶层,可以展开的通知列表。通知的主要作用大概可以分为三大块: 显示未读的消息(短信消息、QQ、微信等消息) 显示客户端的PushMessage(推送消息),如系统更新、新闻、广告推送 显示正在进行的后台程序,如各类型的音乐播放器等。 关键类介绍 ...
android 自定义通知
kk3087961的博客
01-17 438
/自定义的布局视图。一、创建通知布局文件 view_notification_layout.xml。// .setContentText("您有一项新活动")//.setContent(views)//设置布局。// .setContentTitle("活动")
Android 自定义通知样式(回复、点赞)
最新发布
qq_21467035的博客
04-08 216
Android 自定义通知样式(回复、点赞)
Android自定义通知Notification
03-30
自定义标准视图64dip的通知,功能丰富,敬请下载并指点不足。
Android 通知消息
maozhuxigood
02-28 109
通知消息是Android的一个最成功的发明,的确给用户带来很好的体验。 主要用到的类有NotificationManager。是用来管理提醒的。 还有PendingIntent用来指定点击后跳转的。 现在公司的需求就是:需要检查服务端有没有消息要推送,每次打开软件都去检查太消耗了,所以我的策略是每天第一次打开软件时去检测,这一天后来再打开软件就不检测了。 看代码吧: /** * 是否需要...
Android自定义状态通知(Status Notification)的正确实现
java开发指南博客 【转载】
07-30 336
Android应用开发中,经常会使用到状态通知(Status Notification),例如新浪微博、网易新闻等提供的推送消息,软件后台更新时进度的显示等等,如下图所示: 看了网上很多关于Notification的博客文章,发现几乎没有一个能将自定义状态通知完全实现正确的,因此,本文就来说说实现自定义状态通知经常被忽略的一些知识点。 1) 使用Notification最常...
Android自定义通知样式适配
u010148853的博客
08-23 1088
今天是端午节,祝大家节日快乐 这篇文章着实酝酿了许久,一直懒得写。网上关于通知样式适配的文章很多,但还不够完美,这也是我写这篇文章的动力所在。 温故而知新 Android通知有两,默认通知自定义通知。默认通知简单调用系统接口就能实现,如下: 发送默认通知 默认通知效果 自定义通知就稍微麻烦一些,需要定义一个layout文
Android 通知
FlyPig_Vip的博客
10-11 319
一切尽在不言中~ public static final String ACTION_BUTTON_LAST = "INTENT_ACTION_NOTIFY_RECEIVER_LAST"; public static final String ACTION_BUTTON_PLAY = "INTENT_ACTION_NOTIFY_RECEIVER_PLAY"; public st...
notification-Android带按钮自定义通知
03-23
Anroid,一个简单的带按钮自定义通知,欢迎下载试用,人人为我,我为人人,共同学习,共同进步
Android 使用Notification自定义通知显示
10-10
Android 使用Notification自定义通知显示。自定义系统状态通知类NotificationExtend,也可以手动更新状态。依据此项目可以做成线程接受,或者广播接受自动更新。我博客网址: http://blog.csdn.net/qq_16064871。我写了很多博客都是有源码的,请多多关注。
安卓通知自定义布局
02-23
安卓通知自定义布局提示(NotificationCompat.Builder)
Android自定义通知显示在通知
08-21
Android自定义通知显示在通知上,小例子
Android 自定义通知 更新通知进度条
10-29
Android 实现自定义通知,并不断更新通知的进度条,模拟下载效果。 注:只是模拟下载进度,没有下载功能。
Android样式通知
07-30
样式的通知,以及不同版本的兼容性的版本,还有自定义的QQ悬浮窗通知以及前台服务类型的通知
Android通知介绍与适配总结(上篇)
weixin_34268843的博客
11-29 297
此文已由作者黎星授权网易云社区发布。 欢迎访问网易云社区,了解更多网易技术产品运营经验。 由于历史原因,Android在发布之初对通知Notification的设计相当简单,而如今面对各式各样的通知玩法,谷歌也不得不对其进行更新迭代调整,增加新功能的同时,也在不断地改变样式,试图迎合更多人的口味。本文总结了Android通知的版本迭...
android自定义通知样式,Android 通知自定义样式
weixin_30882521的博客
05-25 1127
8.0系统的通知适配在8.0之前我们通知的使用:notification=newNotificationCompat.Builder(mContext).setWhen(System.currentTimeMillis()).setSmallIcon(R.drawable.small_icon)但如果SDK升级到8.0或者以上你会发现这个构建通知的方法已经废弃,并且无法显示通知,这是因为...
自定义通知 android,Android自定义状态通知(Status Notification)的正确实现
weixin_36421674的博客
05-25 1646
Android应用开发中,经常会使用到状态通知(Status Notification),例如新浪微博、网易新闻等提供的推送消息,软件后台更新时进度的显示等等,如下图所示:看了网上很多关于Notification的博客文章,发现几乎没有一个能将自定义状态通知完全实现正确的,因此,本文就来说说实现自定义状态通知经常被忽略的一些知识点。1) 使用Notification最常见的场景运行在后台的...
android 悬浮通知
09-30
Android悬浮通知是指在Android设备的屏幕上以悬浮窗口形式显示的通知。与传统的通知通知不同,悬浮通知会以浮动的方式显示在屏幕上方,用户可以拖动、点击和关闭它。 悬浮通知提供了一更加直观和便捷的通知方式。它可以随时显示在手机屏幕的任何位置,无论用户正在使用哪个应用程序,都可以立即看到通知内容,而无需下拉通知。这对于一些重要的消息和紧急事件来说尤其有用,用户可以快速了解并采取相应的操作。 另外,悬浮通知还可以提供更多的交互功能。除了显示通知的标题、内容和图标外,悬浮窗口还可以包含按钮、输入框和其他交互元素,以便用户可以快速响应通知。例如,当收到来电通知时,用户可以直接在悬浮窗口上进行接听、拒绝或挂起的操作,而无需打开电话应用。 然而,悬浮通知也存在一些争议。因为它会在屏幕上浮动显示,可能会干扰用户当前正在使用的应用程序,尤其是在游戏或观看视频时。一些用户认为这悬浮窗体验过于冗杂,干扰了他们的工作或娱乐。 总的来说,Android悬浮通知是一方便且有用的通知方式,可以提供快速的通知查看和操作。但是,它也需要考虑用户体验和隐私问题,应该在设计上兼顾使用方便性和舒适性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • GT官方教程 14903
  • Android——超简单悬浮窗使用教程 14654
  • Android——8种通知栏-超简单自定义 11828
  • Android——超简单无障碍服务 7485
  • Android——JzvdStd饺子视频 7330

分类专栏

  • GT使用教程 22篇
  • 哆啦百宝箱 1篇
  • 游戏 1篇
  • Android 22篇

最新评论

  • Android——8种通知栏-超简单自定义

    ◇﹎Sēˊ: 麻烦请问下,Android14上提示异常:java.lang.SecurityException: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts 是怎么回事呢?

  • Android——超简单无障碍服务

    PlayfulKing: 已经降低版本了,可以更新到v1.4.5.7 试试

  • Android——超简单无障碍服务

    不见山河: java添加依赖后报错Unsupported class file major version 61,降低了jdk版本还是报这个错

  • GT官方教程

    CSDN-Ada助手: 多亏了你这篇博客, 解决了问题: https://ask.csdn.net/questions/8039369, 请多输出高质量博客, 帮助更多的人

  • Android——GT.Glide 加载图片框架,重磅来袭!!!

    PlayfulKing: 1.检测图片是否为gif图片资源 2.是否使用了 加载动态图的方式加载 3.可能是之前使用了加载静态方式加载了动态图,此时就会将这个静态图缓存到本地,建议清空缓存数据试试。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Android——GT.ARouter 模块解耦神器 全面解析教程
  • 哆啦百宝箱APP
  • Android——超简单的 指纹验证
2024年1篇
2023年4篇
2022年11篇
2021年12篇
2019年4篇

目录

目录

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PlayfulKing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司定西SEO按天扣费价格飞来峡设计公司网站多少钱松原关键词排名包年推广莆田seo排名推荐韶关建网站报价玉溪百度网站优化排名报价广州seo网站优化公司普洱百度网站优化价格蚌埠网站改版报价巢湖关键词按天计费推荐抚州如何制作网站价格桂林百度竞价报价张北企业网站设计推荐曲靖百姓网标王推广推荐杭州网站制作哪家好嘉兴模板网站建设报价莆田SEO按天扣费价格舟山seo排名推荐福州seo网站推广哪家好石岩企业网站制作价格海南模板制作公司株洲网站优化按天扣费哪家好迁安关键词排名包年推广哪家好玉林百姓网标王推荐海南企业网站建设多少钱石家庄网络广告推广推荐伊春推广网站公司三明百度网站优化推荐昭通seo网站推广多少钱泉州SEO按效果付费公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化