我正在尝试根据 RemoteViews 复制 ToggleButton 的功能,因此我可以在我的 App Widget 中继续使用。我有一个 ImageButton,它可以检测点击,但我无法更改它在点击时显示的图像。我的印象是我需要在单击小部件以显示更改后强制更新小部件。知道最好的方法是什么吗?
public class WifiWidget extends AppWidgetProvider {
boolean toggleState = false;
public static String ACTION_WIDGET_RECEIVER = "com.nickavv.cleanwidgets.WIFICLICK";
Context myContext;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]) {
final int N = appWidgetIds.length;
myContext = context;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
RemoteViews views = new RemoteViews("com.nickavv.cleanwidgets", R.layout.wifi_toggle_layout);
Intent intent = new Intent(ACTION_WIDGET_RECEIVER);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.wifiToggleButton, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) {
switchToggle();
}
}
void switchToggle() {
RemoteViews views = new RemoteViews("com.nickavv.cleanwidgets", R.layout.wifi_toggle_layout);
Log.d("toggleState",""+toggleState);
if(toggleState == false) {
views.setImageViewResource(R.id.wifiToggleButton, R.drawable.wifi_toggle_on);
} else {
views.setImageViewResource(R.id.wifiToggleButton, R.drawable.wifi_toggle_off);
}
toggleState = !toggleState;
Log.d("toggleState",""+toggleState);
}
编辑:将此添加到 switchToggle 的底部:
AppWidgetManager myAWM = AppWidgetManager.getInstance(myContext);
ComponentName cn = new ComponentName(myContext, WifiWidget.class);
onUpdate(myContext, myAWM, myAWM.getAppWidgetIds(cn));
最佳答案
是的,您必须更新小部件。从这里可以看出,您可以直接调用 onUpdate()
并读取其中的按钮状态以相应地更新您的 RemoteViews
。只需使用 RemoteViews.setImageViewResource()
设置与当前按钮状态对应的图像。
调用 onUpdate()
所需的只是参数,您可以通过 Context
获取这些参数:
- 上下文:您可以将其从接收器传递给
switchToggle()
,然后传递给onUpdate()
- AppWidgetManager 实例:通过
AppWidgetManager.getInstance(context)
获取 - 应用小部件 ID 数组:使用
AppWidgetManager.getAppWidgetIds()
getAppWidgetIds()
将 ComponentName
作为参数。
您可以像下面这样创建一个:
ComponentName cn = new ComponentName(context, WifiWidget.class);
您还可以使用整个构造从任何给定点更新您的应用程序小部件,您不受 onUpdate()
的约束。只需在构建您的 RemoteViews
后使用附加的 AppWidgetManager.updateAppWidget()
调用来发布它们(显示您的 UI 更改)。
关于android - AppWidget中的ImageButton更新源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7589117/