说明:
一个RemoteView对象只能支持下面几种layout布局类:
FrameLayout  LinearLayout   RelativeLayout
支持下面几种widget 类:
AnalogClock   Button  Chronometer  ImageButton  ImageView  ProgressBar  TextView  ViewFlipper  ListView  GridView
StackView  AdapterViewFlipper
PS:这些类的继承类也是不被支持的。
--------------------------------------------------------------------------------------------------------------------------
我的需求是:
桌面上小组件的按钮被点击后按钮背景切换至背景2,再次点击切换回背景1,。
我的思路:
由于widget不支持check这类组件,所以我采用的是计算button被点击次数,然后对点击次数除以2取余数的做法(返回结果只有0,1)。目前取余的做法是能实现改变状态的,但是没法改变背景,请各位赐教。
下面贴代码
 @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.appwidget.action.SHACK")){
            Log.i("发送广播至widgetprovider", "shack"+BusinessSharedPreferences.getBtnCount(context));
            count=BusinessSharedPreferences.getBtnCount(context);
            if (count%2==0){
                mWidgetValueInterface.SendwidgetValue(true);       //能实现
               //rv.setImageViewResource(R.id.widget_shack,R.drawable.on_btn);  //不能实现
            }else {
                mWidgetValueInterface.SendwidgetValue(false);   //能实现
              //  rv.setImageViewResource(R.id.widget_shack, R.drawable.off_btn);  //不能实现
            }
            count=count+1;
            BusinessSharedPreferences.setBtnCount(context, count);
        } else {
            super.onReceive(context, intent);
        }    } @Override
    public void onUpdate( final Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        //刷新时执行
        //一般通过remoteview和appwidgetmanger操作
        timer=new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {                 rv=new RemoteViews(context.getPackageName(), R.layout.widget_layout);
                rv.setTextViewText(R.id.tv, "hello wrold");                 /*widget_shack的处理事件  发送广播至widgetprovider*/
                Intent intent1 = new Intent("android.appwidget.action.SHACK");
                PendingIntent pendIntent1 = PendingIntent.getBroadcast(context, 0, intent1, 0);
                rv.setOnClickPendingIntent(R.id.widget_shack,pendIntent1);                AppWidgetManager manager= AppWidgetManager.getInstance(context);
                ComponentName cn=new ComponentName(context, WidgetProvider.class);
                manager.updateAppWidget(cn, rv);            }
        },0,1000);    }

解决方案 »

  1.   

    我这也是点击Widget 更换图标
     <receiver android:name=".NewAppWidget">
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                    <action android:name="com.widget.3dcontrol" />
                </intent-filter>            <meta-data
                    android:name="android.appwidget.provider"
                    android:resource="@xml/new_app_widget_info" />
            </receiver>public class NewAppWidget extends AppWidgetProvider {
        public static boolean is_3d_open;
        private static RemoteViews remoteViews;    @Override
        public void onReceive(Context context, Intent intent) {
            super.onReceive(context, intent);
            if (remoteViews == null) {
                remoteViews = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
            }
            if (intent.getAction().equals("com.widget.3dcontrol")) {
                Log.e("is_3d_open", is_3d_open);
                if (is_3d_open) {
                    remoteViews.setImageViewResource(R.id.iv_3d_control, R.mipmap.icon_off);
                    is_3d_open = false;
                   
                } else {
                    remoteViews.setImageViewResource(R.id.iv_3d_control, R.mipmap.icon_on);
                    is_3d_open = true;
                   
                }
            }
            AppWidgetManager appWidgetManger = AppWidgetManager.getInstance(context);
            int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(context, NewAppWidget.class));
            appWidgetManger.updateAppWidget(appIds, remoteViews);
        }    @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
            final int N = appWidgetIds.length;
            for (int i = 0; i < N; i++) {
                int appWidgetId = appWidgetIds[i];
                updateAppWidget(context, appWidgetManager, appWidgetId);
            }
        }    public static void updateAppWidget(Context context, AppWidgetManager appWidgeManger, int appWidgetId) {
            remoteViews = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
            Intent intent = new Intent("com.widget.3dcontrol");
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
            remoteViews.setOnClickPendingIntent(R.id.iv_3d_control, pendingIntent);
            appWidgeManger.updateAppWidget(appWidgetId, remoteViews);
        }}