我有一个带有一个小部件的应用程序,该小部件上有一个开关和一个扩展服务以管理小部件上的内容的类。我正在使用 RemoteViews 访问视图以对其进行编辑,但是我想做一些事情,这取决于开关的状态。有没有办法获得开关的状态?我浏览了api,但找不到方法。
先发制人:我不能使用 findViewById 因为它不是活动
如果需要,我可以发布代码。
为了清楚起见,我想使用的开关类型是这样的
我有一个带有一个小部件的应用程序,该小部件上有一个开关和一个扩展服务以管理小部件上的内容的类。我正在使用 RemoteViews 访问视图以对其进行编辑,但是我想做一些事情,这取决于开关的状态。有没有办法获得开关的状态?我浏览了api,但找不到方法。
先发制人:我不能使用 findViewById 因为它不是活动
如果需要,我可以发布代码。
为了清楚起见,我想使用的开关类型是这样的
您是否遵循App Widgets 指南?我不认为Switch
小部件在RemoteViews
.
无论如何,由于您无法按需获取任何信息,因此您需要使用setOnClickPendingIntent()
并让点击发送更新您的应用小部件的意图。在 Intent 中添加一个额外的内容,指定按钮处于什么状态(或者单击时它将变为什么状态,任一个)。在更新逻辑中,读取额外内容,更改 UI,并设置一个新的 PendingIntent 并更改额外内容。
public class MyAppWidgetProvider extends AppWidgetProvider {
public static final String ACTION_UPDATE_SWITCH = "MyAppWidgetProvider.UPDATE_SWITCH";
public static final String EXTRA_SWITCH_ON = "MyAppWidgetProvider.EXTRA_SWITCH_ON";
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (ACTION_UPDATE_SWITCH.equals(action)) {
int id = intent.getIntExtra(AppWidgetManager.EXTRA_APPWDIGET_ID, 0);
if (id != 0) {
updateAppWidgetSwitch(context, intent, id);
}
}
super.onReceive(context, intent);
}
private void updateAppWidgetSwitch(Context context, Intent intent, int appWidgetId) {
boolean switchOn = intent.getBooleanExtra(EXTRA_SWITCH_ON, false);
// take some action based on the switch being clicked
RemoteViews views = new RemoteViews (context.getPackageName(), R.layout.app_widget_layout);
// normal RemoteViews stuff
// use switchOn var to set your switch state
// make new on click pending intent
Intent intent = new Intent(ACTION_UPDATE_SWITCH);
intent.putExtra(AppWidgetManager.EXTRA_APPWDIGET_ID, id);
intent.putExtra(EXTRA_SWITCH_ON, !switchOn); // new state
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.switch_id, pendingIntent);
// update widget
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
// other AppWidgetProvider methods ...
}
在您的清单中,将此意图过滤器添加到您的 AppWidgetProvider 的<receiver>
元素中。请注意,如果您更改了上面操作字符串的值,请确保您在此处也进行了更改。
<intent-filter>
<action android:name="MyAppWidgetProvider.EXTRA_SWITCH_ON" />
</intent-filter>