Android 添加自己的时钟小部件

小部件,也叫微件,
它的介绍参考官网 应用 widget 概览 https://developer.android.google.cn/develop/ui/views/appwidgets/overview?hl=zh-cn

直接上图,原生系统上,时钟应用的小部件效果。
在这里插入图片描述

我也整一个。

1.创建小部件布局文件

这个文件就是最终显示在桌面的小部件的样式。
res/layout/time_widget_layout.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:paddingTop="6dp"android:paddingBottom="6dp"android:gravity="center"android:orientation="vertical"><TextClockandroid:id="@+id/tv_date"android:layout_width="match_parent"android:layout_height="22dp"android:format12Hour="yyyy/MM/dd E"android:format24Hour="yyyy/MM/dd E"android:gravity="center"android:textSize="17sp"android:textColor="#DBE1FF" /><TextClockandroid:id="@+id/tv_time"android:layout_width="match_parent"android:layout_height="101dp"android:format12Hour="h:mm"android:format24Hour="HH:mm"android:gravity="center"android:textColor="#DBE1FF"android:textSize="@dimen/textclock_time_size" /></LinearLayout>

使用 TextClock 显示日期、时间,很方便,它会自己更新,不需要添加刷新逻辑。

2.创建小部件配置文件

AppWidgetProviderInfo 对象定义了 widget 的基本特性。

res/xml/time_widget.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:initialLayout="@layout/time_widget_layout"android:minHeight="110dp"android:minWidth="110dp"android:resizeMode="vertical|horizontal"android:previewImage="@drawable/pic_beauty"android:updatePeriodMillis="3000" />
  • android:initialLayout :指向小部件布局文件 。
  • android:minHeight 、android:minWidth :小部件原始占用区域大小,也是最小占用区域大小,我的示例占用的是 2 x 2 。
  • android:resizeMode=“vertical|horizontal” :是否支持调整大小,这个是横向、纵向都支持。
  • android:previewImage :小部件的预览图。
  • android:previewLayout:小部件预览页面的布局。本例只设置了预览图,没有添加布局,有需要自己添加即可。
  • android:updatePeriodMillis :小部件更新时间间隔。

小部件的大小要根据实际情况计算,参考官网示例
在这里插入图片描述
参考 Android Developers 应用微件设计指南

3.实现AppWidgetProvider

3.1 在清单中声明自定义的 AppWidgetProvider

AppWidgetProvider 本质是 receiver 。

        <receiverandroid:name=".appwidget.TimeWidgetProvider"android:exported="true"android:label="TimeWidgetLabel"><meta-dataandroid:name="android.appwidget.provider"android:resource="@xml/time_widget" /><intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter></receiver>
  • android:name=“.appwidget.TimeWidgetProvider” :要实现的自定义 AppWidgetProvider
  • <meta-data/> 里的 android:name 是默认格式,不要改;android:resource 指向小部件配置文件。
  • <intent-filter> 里的是默认格式,不要修改。

3.2 实现自定义的 AppWidgetProvider

创建 TimeWidgetProvider ,继承 AppWidgetProvider

public class TimeWidgetProvider extends AppWidgetProvider {public static final String TAG = TimeWidgetProvider.class.getSimpleName();@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);Log.d(TAG, "onReceive : " + intent.getAction());}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);Log.d(TAG, "onUpdate");}
}

onReceive 里会接收到这些广播:

  • android.appwidget.action.APPWIDGET_ENABLED :小部件第一次被添加到桌面时触发。如果添加同一个小部件两次,第二次添加不会触发。对应 onEnabled 方法。
  • android.appwidget.action.APPWIDGET_UPDATE :小部件被添加到桌面或者小部件更新时触发。对应 onUpdate 方法。
  • android.appwidget.action.APPWIDGET_DELETED :小部件被删除时触发。如果同一个小部件有多个,删一个触发一次。对应 onDeleted方法。
  • android.appwidget.action.APPWIDGET_DISABLED :同一个小部件,最后一个被删除时触发。对应 onDisabled方法。
  • android.appwidget.action.APPWIDGET_UPDATE_OPTIONS :用户调整小部件大小时触发。对应 onAppWidgetOptionsChanged 方法。

到这里,初版已OK。

3.3 更新小部件

使用 RemoteViews 更新调整UI 、添加点击事件,然后调用 AppWidgetManager.updateAppWidget 即可。

	private RemoteViews remoteViews;private AppWidgetManager mAppWidgetManager;private int[] mAppWidgetIds;public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);Log.d(TAG, "onUpdate");mAppWidgetManager = appWidgetManager;mAppWidgetIds = appWidgetIds;Log.d(TAG, "onUpdate appWidgetIds:" + Arrays.toString(mAppWidgetIds));createRemoteViews(context);}private void createRemoteViews(Context context) {if (remoteViews == null) {Log.d(TAG, "createRemoteViews");remoteViews = new RemoteViews(context.getPackageName(), R.layout.time_widget_layout);//注释1Intent intent = new Intent("android.settings.DATE_SETTINGS");intent.setPackage("com.android.settings");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);PendingIntent pendingIntent1, pendingIntent2;if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {pendingIntent1 = PendingIntent.getActivity(context, 101, intent, PendingIntent.FLAG_IMMUTABLE);pendingIntent2 = PendingIntent.getActivity(context, 102, intent, PendingIntent.FLAG_IMMUTABLE);} else {pendingIntent1 = PendingIntent.getActivity(context, 101, intent, PendingIntent.FLAG_UPDATE_CURRENT);pendingIntent2 = PendingIntent.getActivity(context, 102, intent, PendingIntent.FLAG_UPDATE_CURRENT);}remoteViews.setOnClickPendingIntent(R.id.tv_time, pendingIntent1);remoteViews.setOnClickPendingIntent(R.id.tv_date, pendingIntent2);//注释2for (int id:mAppWidgetIds) {mAppWidgetManager.updateAppWidget(id, remoteViews);//注释3}}

注释1 :通过 RemoteViews 找到 小部件布局文件,

RemoteViews 提供了很多方法更新小部件,如

  • setTextViewText(@IdRes int viewId, CharSequence text) :根据 id 设置 TextView 。
  • setImageViewResource(@IdRes int viewId, @DrawableRes int srcId) :根据 id 设置 ImageView。
  • setOnClickPendingIntent(@IdRes int viewId, PendingIntent pendingIntent) :根据 id 设置点击事件。

本例用的 TextClock ,会自动更新时间,就没有加 RemoteViews 的逻辑。

注释2 :使用 PendingIntent 为各个控件添加点击事件。如果不加,默认打开应用首页。本例打开原生设置的 日期和时间 。

注释3 :调用 AppWidgetManager.updateAppWidget 更新小部件。

最终效果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/362472.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Python+Flask+MySQL+HTML的B站数据可视化分析系统

FlaskMySQLVue 基于PythonFlaskMySQLHTML的B站数据可视化分析系统 项目采用前后端分离技术&#xff0c;项目包含完整的前端HTML&#xff0c;以及Flask构成完整的前后端分离系统 爬虫文件基于selenium&#xff0c;需要配合登录账号 简介 主页 登录页面&#xff0c;用户打开浏…

如何在线上快速定位bug(干货)

想必有许多人都想我刚进公司一样不会快速定位线上bug吧&#xff0c;不会快速定位bug会大大降低我们的开发效率&#xff0c;随之而来的就是工作质量下降、业绩下滑。 我总结了一些我常用的线上定位技巧&#xff0c;希望能帮助到大家&#xff01; 我这里以使用阿里云日志分析作…

[Linux] 文件/目录命令

pwd print working directory cd change directory cd #返回主目录 cd ..返回上级目录 cd . 不动 cd ~ 用户名 进入某用户的主目录 mkdir mkdir 目录名 mkdir -p xx/yy/zz #一次创建多重目录 rmdir remove directory 删除空目录&#xff0c;只能删除空目录&#xff0c;别的不能…

2021年12月电子学会青少年软件编程 中小学生Python编程等级考试三级真题解析(选择题)

2021年12月Python编程等级考试三级真题解析 选择题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1、小明在学习计算机时&#xff0c;学习到了一个十六进制数101,这个十六进制数对应的十进制数的数值是 A、65 B、66 C、256 D、257 答案&#xff…

Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程

方法一&#xff1a;PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错&#xff0c;懒得费时间处理&#xff0c;直接用第二种 方法二&#xff1a;suhosin禁用 不支持PHP8&#xff0c;官方只支持PHP7以下…

# bash: chkconfig: command not found 解决方法

bash: chkconfig: command not found 解决方法 一、chkconfig 错误描述&#xff1a; 这个错误表明在 Bash 环境下&#xff0c;尝试执行 chkconfig 命令&#xff0c;但是系统找不到这个命令。chkconfig 命令是一个用于管理 Linux 系统中服务的启动和停止的工具&#xff0c;通常…

MySQL周内训参照4、触发器-插入-修改-删除

触发器 1、用户购买商品时&#xff0c;要求库存表中的库存数量自动修改 详细示例 delimiter $$ create trigger stock_change after -- 事件触发在 下订单之后 insert -- 监视插入事件 on stock -- 监视 order订单表 for each row begin update stock set stockstock-new.st…

2024年6月27日 (周四) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 喜马拉雅下载工具: 字面意思 Steam国产“类8番”游戏《永恒逃脱&#xff1a;暗影城堡》…

多路h265监控录放开发-(14)通过PaintCell自定义日历控件继承QCalendarWidget的XCalendar类

首先创建一个新类XCalendar继承QCalendarWidget类&#xff0c;然后在UI视图设计器中把日历提升为XCalendar&#xff0c;通过这个函数自己设置日历的样式 xcalendar.h #pragma once #include <QCalendarWidget> class XCalendar :public QCalendarWidget { public:XCal…

C#udpClient组播

一、0udpClient 控件&#xff1a; button&#xff08;打开&#xff0c;关闭&#xff0c;发送&#xff09;&#xff0c;textbox&#xff0c;richTextBox 打开UDP&#xff1a; UdpClient udp: namespace _01udpClient {public partial class Form1 : Form{public Form1(){Initi…

最新Adobe2024全家桶下载,PS/PR/AE/AI/AU/LR/ID详细安装教程

如大家所熟悉的&#xff0c;Adobe全家桶系列常用的软件有Photoshop&#xff08;PS&#xff09;、Premiere&#xff08;PR&#xff09;、After Effects&#xff08;AE&#xff09;、illustrator&#xff08;AI&#xff09;、Audition&#xff08;AU&#xff09;、Lightroom&…

计算机视觉-期末复习-简答/名词解释/综合设计

目录 第一讲--计算机/机器视觉概述 名词解释 简答 第二讲--图像处理概述 名词解释 简答 第三讲没划重点习题 第四讲--特征提取与选择 名词解释 简答 综合题 第五讲--不变特征 名词解释 简答 第六讲--物体分类与检测 简答 综合题 第七讲--视觉注意机制 简答 …

操纵系统的特征-线程的六种状态

线程的六种状态 线程是操作系统进行运算调度的最小单位&#xff0c;它可以分为六种状态 新建状态&#xff08;NEW&#xff09; 用new创建一个线程对象&#xff0c;这时候处于新建状态 可运行状态&#xff08;RUNNABLE&#xff09; 可运行状态又分为两种状态&#xff1a;就绪…

公司新来了个半吊子测试,没想到居然是个卷王!

最近招了一个测试坐我旁边&#xff0c;想着好好培养一下&#xff0c;要她有什么不懂可以来问我&#xff0c;但工作几天了也没看她来问问题什么的&#xff0c;以为他是个半吊子测试&#xff0c;结果有一天我发现&#xff0c;她竟然趁我不在的时候偷偷努力…&#xff0c;原来她这…

机器学习之集成学习

一&#xff1a;概念 顾名思义集成学习就是用多个其他的算法结合起来使用 对于“其他算法”有同类和同质的区别&#xff0c;同质指的是所用的算法都是同一类型的&#xff0c;比如决策树和神经网络&#xff0c;这种也叫基学习器。反之亦然&#xff0c;但一般使用的是同质的。 …

【Redis】三大Redis内存分析工具介绍(Redisinsight、RDR、RMA)

一、RedisInsight工具介绍 RedisInsight是一款Redis官方开源的可视化管理工具&#xff0c;旨在帮助开发人员和管理员更轻松地设计、开发和优化Redis应用程序。以下是关于RedisInsight的详细介绍&#xff1a; 1、工具概述 定义&#xff1a;RedisInsight是一个直观且高效的Red…

数据库层持久化

数据持久化层 冷热分离 冷热分离&#xff1a;将常用的“热”数据和不常使用的“冷”数据分开存储 冷热分离就是在处理数据时将数据库分成冷库和热库&#xff0c;冷库存放那些走到终态、不常使用的数据&#xff0c;热库存放还需要修改、经常使用的数据 业务需求出现了以下情况…

基于ssh框架的个人博客源码

基于ssh的个人博客源码&#xff0c;页面清爽简洁&#xff0c;原先有部分bug,运行不了&#xff0c;现已修复 1.博客首页 &#xff08;本地访问地址 :localhost:8080/Blog/index/index&#xff09; 2.关于我 3.慢生活 4.留言板 5.我的相册 微信扫码下载源码

【PTA】7-1 网红点打卡攻略(C/C++)代码实现 反思

解题细节分析&#xff1a; 0.比较图的两种存储方法&#xff0c;通过邻接矩阵存储更便于查找给定两点之间的关系 1.注意理解清楚题义&#xff1a;“访问所有网红点”中所有不是指攻略中所有&#xff0c;而是存在的全部的网红点 代码见下&#xff1a;// 需要注明的是&#xff…

M4V文件损坏无法播放?一招轻松修复损坏视频文件!

M4V是一个标准视频文件格式&#xff0c;此种格式常在iPod 、 iPhone 和 PlayStation Portable等设备上使用&#xff0c;同时此格式基于MPEG-4编码第二版&#xff0c;是MP4格式的一种特殊类型&#xff0c;有时可能会因为各种原因而损坏&#xff0c;导致无法正常播放。M4V文件出现…