说明:
一个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); }
一个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); }
<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);
}}