appwidget 窗口小部件学习笔记

本文介绍了在Android中开发窗口小部件(AppWidget)的相关知识,包括Widget大小的计算方法,关机重启后如何处理Widget的刷新,如何在AppWidgetProvider中设置RemoteView和响应点击事件,以及如何获取并更新所有小部件的ID。还提到了在RemoteView中声明可操作的控件以及通过appwidgetId实现不同小部件的点击事件跳转。
摘要由CSDN通过智能技术生成

接了个模块,做便签,所以在学习便签的过程成也对窗口小部件小有收获,分享之:

 

Widget大小的计算 :(单元格数*74)-2,API上说是为了防止像素计算时的整数舍入导致错所以-2...不是很明白

 

- --------------------------------------------------------------------------------------------------------------------------

关机在开机后,会刷新桌面上的所有widget,调用其AppWidgetProvider的onReceive->onUpdate->onReceive方法

故必须在 AppWidgetProvider中,处理及面的刷新时,RemoteView内容的显示,或者onclick事件的响应。


生成一个新的小部件的时候的Id分配

Bundle extras = intent.getExtras();
 if (extras != null) {
          mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,                 AppWidgetManager.INVALID_APPWIDGET_ID);
}
                              
 // If they gave us an intent without the widget id, just bail.
 if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
         finish();
}

 

----------------------------------------------------------------------------------------------------------------------------

获取当前provider在桌面上显示的所有小部件的id值

 

Bundle extras = intent.getExtras();
            if (extras != null) {
                int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
                if (appWidgetIds != null && appWidgetIds.length > 0) {
                    this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
                }
            }

 

 

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

int[] appWidgetIds=appWidgetManager.getAppWidgetIds(new  ComponentName(this, myWidgetProviderLarge.class));

 

----------------------------------------------------------------------------------------------------------------------------

 

可以在RemoveView中布局的控件,必须在其类上做@RemoteView声明

如源码中的 TextView:

@RemoteView
public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {...}

 

------------------------------------------------------------------------------------------------------------------------------

如果生成多个内容不同的桌面小部件,并且使其可响应点击事件,打开响应id对应的内容,则需记录每个小部件的appwidgetId,并将其发送给点击事件相应的activity。

如当前activity为小部件的配置活动,点击打开EditWidget.java:

                Intent configIntent = new Intent(this, EditWidget.class);           
                configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);               
                configIntent.setAction(uri.toString());
                PendingIntent pendingIntent = PendingIntent.getActivity(EditNote.this, 0,configIntent, 0);
                views.setOnClickPendingIntent(R.id.note_appwidget, pendingIntent);
               
                AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(EditNote.this);
                appWidgetManager.updateAppWidget(mAppWidgetId, views);

 

点击后打开EditWidget.java

        Intent t = getIntent();   
        Log.i("", "this is ===="+t.getAction());
        mAppWidgetId = t.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
        Log.i("", "this is  [" + mAppWidgetId + "] editing!");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值