android 中widget组件
来源:互联网 发布:lubot软件 编辑:程序博客网 时间:2024/05/07 13:24
<span style="font-family: Arial, Helvetica, sans-serif;">Widget (微件、小组件)</span>1)写布局文件对于widget的布局文件有限制!不是所有的组件都能够使用的。 容器类视图目前只支持四种:LinearLayout,RelativeLayout,FrameLayout,GridLayout容器类目前支持的视图组件:AnalogClock 模拟时钟ChronoMeter 电子时钟、计时器ButtonImageButtonTextViewImageViewViewFlipper等(随着SDK版本的迭代,可支持的视图数量在增加)不能用的:自定义视图一概不能用(View) 上述可用视图的子类一概不能用 (比如EditText)2)写一个描述文件,用来描述widget的一些属性写在res/xml文件下有四个属性必须声明:minWidht/minHeight:小组件拖动到屏幕上之后,系统会根据你指定的这两个值估算会占用多少格。屏幕上会被系统划分为4*4个格子,每个格子具体尺寸,根据屏幕尺寸和密度的不同会有所差异。Google早期给出了一个minWidth/minHeight的经验计算公式:70*n-30 dp在高密度大尺寸屏幕下还有一个经验公式:74*n-2
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="250dp" android:minHeight="110dp" android:updatePeriodMillis="1800000" android:initialLayout="@layout/widget_layout" ></appwidget-provider>
updatePeriodMillis 系统会按照该时间间隔,通过发送系统广播的方式,来更新Widget的显示内容。发送的系统广播的action是android.appwidget.action.APPWIDGET_UPDATE,widget一旦受到该广播,会调用onUpdate方法。updatePeriodMillis指定的时间间隔不得低于30分钟所对应的毫秒值。低于该值,则设定无效,系统依然会每隔半小时发送一次广播。3)写一个类,继承自AppWidgetProvider类
XML文件 <TextView android:id="@+id/tv_widget_number" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:padding="8dp" android:text="XXX" /> <TextView android:id="@+id/tv_widget_number2" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:padding="8dp" android:text="XXX" /> <Button android:id="@+id/btn_widget_getnumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="获取随机数字" />
5个方法:
例:点击button获取随机数和每隔一段时间自动生成随机数onReceive:用来收广播@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);String action=intent.getAction();if("com.tarena.UPDATE_WIDGET".equals(action)){int number=intent.getIntExtra("number", -1);RemoteViews views=new RemoteViews(context.getPackageName(), R.layout.widget_layout);views.setTextViewText(R.id.tv_widget_number2, number+"");AppWidgetManager manger=AppWidgetManager.getInstance(context);manger.updateAppWidget(new ComponentName(context, MyWidget.class), views);}}
onEnable:当前仅当,第一个Widget被拖到桌面上的时候,该方法会被调用。在第一个widget被拖到到桌面的时候,系统会发送系统广播,onReceive方法收到该广播后会调用onEnable方法。
onUpdate:当Widget被拖动桌面上,该方法都会被调用一次。widget被拖到到桌面的时候,系统会发送系统广播,onReceive方法收到该广播后会调用onUpdate方法。然后,每隔updatePerioidMillis时间,系统还会发送一次系统广播,该方法依然会被调用一次。@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);//要先创建一个RemoteView的对象RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);//为按钮绑定监听器//点击按钮刷新TextView中的内容Intent intent = new Intent(context,MyService.class);//用来启动service的intentPendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);remoteViews.setOnClickPendingIntent(R.id.btn_widget_getnumber, pendingIntent);//利用AppWidgetManager把RemoteViews“提交”给安卓,安卓在Widget时//会按照你为RemoteViews指定的方式来进行ComponentName provider = new ComponentName(context, MyWidget.class);appWidgetManager.updateAppWidget(provider, remoteViews);}
onDeleted:当一个Widget从桌面上被删除的时候,该Widget的onDeleted方法会被调用。
onDisable:当且仅当最后一个Widget从桌面上删除的时候,该Widget除了onDeleted方法会被调用之外,它的onDisable方法也会被调用4)在AndroidManifest文件中,“注册”第3步写好的类<meta-data android:name="android.appwidget.provider" android:resource="@xml/mywidget" />5)创建<span style="font-family: Arial, Helvetica, sans-serif;">Service</span>public class MyService extends Service {<span style="white-space:pre"></span>Thread thread;<span style="white-space:pre"></span><span style="white-space:pre"></span>public MyService() {<span style="white-space:pre"></span>}<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public void onCreate() {<span style="white-space:pre"></span>super.onCreate();<span style="white-space:pre"></span>thread=new Thread(){<span style="white-space:pre"></span>public void run() {<span style="white-space:pre"></span>try{<span style="white-space:pre"></span>while (!Thread.interrupted()) {<span style="white-space:pre"></span>Intent intent=new Intent("com.tarena.UPDATE_WIDGET");<span style="white-space:pre"></span>intent.putExtra("number", new Random().nextInt(100));<span style="white-space:pre"></span>sendBroadcast(intent);<span style="white-space:pre"></span>Thread.sleep(2000);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}catch (Exception e) {<span style="white-space:pre"></span>}<span style="white-space:pre"></span>};<span style="white-space:pre"></span>};<span style="white-space:pre"></span>thread.start();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public void onDestroy() {<span style="white-space:pre"></span>super.onDestroy();<span style="white-space:pre"></span><span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public int onStartCommand(Intent intent, int flags, int startId) {<span style="white-space:pre"></span>//刷新Widget中TextView内容的代码<span style="white-space:pre"></span>//要先创建一个RemoteView的对象<span style="white-space:pre"></span>RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_layout);<span style="white-space:pre"></span><span style="white-space:pre"></span>//为按钮绑定监听器<span style="white-space:pre"></span>//点击按钮刷新TextView中的内容<span style="white-space:pre"></span>views.setTextViewText(R.id.tv_widget_number, new Random().nextInt(1000)+"");<span style="white-space:pre"></span>views.setTextColor(R.id.tv_widget_number, Color.rgb(new Random().nextInt(256), new Random().nextInt(256),new Random().nextInt(256)));<span style="white-space:pre"></span>//利用AppWidgetManager把RemoteView "提交"给安卓,安卓早Widget的时候<span style="white-space:pre"></span>//会按照你为RemoteView指定的方式来进行<span style="white-space:pre"></span>AppWidgetManager manager = AppWidgetManager.getInstance(this);<span style="white-space:pre"></span>manager.updateAppWidget(new ComponentName(this, MyWidget.class), views);<span style="white-space:pre"></span><span style="white-space:pre"></span>return super.onStartCommand(intent, flags, startId);<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public IBinder onBind(Intent intent) {<span style="white-space:pre"></span>throw new UnsupportedOperationException("Not yet implemented");<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}
0 0
- android 中widget组件
- Android widget 组件
- Android Widget组件ScrollView
- Android---widget组件开发
- Android之Widget组件
- 原生Android中图库的Widget组件小解
- Android 桌面组件【widget】初探
- Android 桌面组件【widget】初探
- Android 桌面组件【app widget】
- Android 桌面组件【widget】初探
- android widget组件之Button
- Android 桌面组件【widget】初探
- Android 桌面组件【widget】初探
- Android组件(widget)Raidobutton
- Android 桌面组件【widget】初探
- Android 桌面组件widget初探
- Android 桌面组件【widget】 初学
- Android widget 桌面组件开发
- 福建省第七届大学生程序设计竞赛 ---- 赛后总结
- HDU 5695 Gym Class(拓扑排序)
- ViewPager轮播
- Ask
- 无限轮播
- android 中widget组件
- DOS批处理中%cd%和%~dp0的区别
- XML的pull解析方式
- 高效能人士的七个习惯——习惯一:积极主动
- java 实验三 面向对象程序设计(无脑实验系列)
- Java开发人员必懂的基础——反射与动态代理
- 二级列表
- Java设计模式(十一) 享元模式
- HTML/CSS/Javascript代码在线压缩、格式化(美化)工具