从android小部件切换状态

时间:2013-07-31 15:26:10

标签: android android-widget widget switch-statement

我有一个带有小部件的应用程序,该小部件上有一个开关,还有一个扩展服务的类来管理小部件上的内容。我正在使用RemoteViews来访问视图来编辑它们,但是我想要做的事情取决于交换机的状态。有没有办法获得开关的状态?我已经看过api,但找不到办法。

先发制人:我不能使用findViewById因为它不是活动

如果需要,我可以发布代码。

为清楚起见,我想使用的交换机类型就像这个http://1.bp.blogspot.com/-AXi56wp5zVE/T6pAZj-MXdI/AAAAAAAAACM/-wT0w1PpcJ4/s1600/device-2012-05-09-152937.png

1 个答案:

答案 0 :(得分:1)

您是否关注App Widgets Guide?我认为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 ...
}

在清单中,将此intent过滤器添加到AppWidgetProvider的<receiver>元素中。请注意,如果您更改上面的操作字符串的值,请确保您也在此处更改它。

<intent-filter>
    <action android:name="MyAppWidgetProvider.EXTRA_SWITCH_ON" />
</intent-filter>