安卓widget开发--可滑动widget带点击控件

1、控件选择

widget可以支持的控件很少,想做滑动wigdet,可以支持的控件就更少了,目前已知的仅有AdapterViewFlipper和ViewFlipper,且不支持自定义;我使用的是AdapterViewFlipper来实现;

2、具体实现

2.1 正常创建widget类,继承AppWidgetProvider;
2.2 updateAppWidget方法中引用布局并设置控件;

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {
        //获取Widget的组件名
        ComponentName componentName = new ComponentName(context, ImageTextWidget.class);
        // 创建一个RemoteView
        @SuppressLint("RemoteViewLayout") SkinRemoteViews remoteViews = new SkinRemoteViews(context.getPackageName(), R.layout.image_text_widget2);
	    remoteViews.setImageViewResource(R.id.iv_default,R.mipmap.icon_widget_imagetext);
        // 把这个Widget绑定到RemoteViewsService
        **Intent serviceIntent = new Intent(context, FilpperAdapterService.class);**
        serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        // 设置适配器
        remoteViews.setRemoteAdapter(R.id.avfilpper, serviceIntent);
        // 设置当显示的widget_list为空显示的View
        remoteViews.setEmptyView(R.id.avfilpper, R.id.iv_default);
        // 点击列表触发事件
        Intent clickIntent = new Intent(context, ImageTextWidget.class);
        // 设置Action,方便在onReceive中区别点击事件
        clickIntent.setAction("com.iflytek.autofly.h5app.click");
        clickIntent.setData(Uri.parse(clickIntent.toUri(Intent.URI_INTENT_SCHEME)));
        **PendingIntent pendingIntentTemplate = PendingIntent.getBroadcast(
                MyApplication.myApp, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setPendingIntentTemplate(R.id.avfilpper,
                pendingIntentTemplate);**

        //默认图点击事件,重新发起网络请求更新数据
        Intent reqIntent = new Intent(context,ImageTextWidget.class);
        reqIntent.setAction("com.iflytek.autofly.h5app.clickReq");
        PendingIntent reqPanding = PendingIntent.getBroadcast(
              MyApplication.myApp,0,reqIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.iv_default,reqPanding);
        //由AppWidgetManager处理Wiget。
        appWidgetManager.updateAppWidget(componentName, remoteViews);

    }

2.3 编写FilpperAdapterService类,继承RemoteViewsService;

@Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {
        Log.d(TAG,"onGetViewFactory... ");
        return new FilpperRemoteViewsFactory(this.getApplicationContext(),intent);
    }

2.4 编写FilpperRemoteViewsFactory类,继承RemoteViewsFactory;
这里面需要注意getViewAt方法里面的写法;

@Override
     public RemoteViews getViewAt(int position) {
     ...省略前面代码内容...
// 填充Intent,填充在AppWdigetProvider中创建的PendingIntent
         Intent fillInIntent = new Intent();
         fillInIntent.putExtra("packageName",bannerAttachBean.getUri().getPackageName());
         fillInIntent.putExtra("action",bannerAttachBean.getUri().getAction());
         BannerAttachBean.UriBean uriBean = bannerAttachBean.getUri();
         fillInIntent.putExtra("uri",gson.toJson(uriBean));
         rv.setOnClickFillInIntent(R.id.iv_image,fillInIntent);
         ...省略后面代码内容...
         }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值