【问题标题】:Switch status from android widget从 android 小部件切换状态
【发布时间】:2013-07-31 15:26:10
【问题描述】:

我有一个带有一个小部件的应用程序,该小部件上有一个开关和一个扩展服务以管理小部件内容的类。我正在使用 RemoteViews 访问视图以编辑它们,但是我想做一些取决于开关状态的事情。有没有办法获得开关的状态?我浏览了api,但找不到方法。

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

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

为了清楚起见,我想使用的开关类型是这样的

【问题讨论】:

    标签: android android-widget widget switch-statement


    【解决方案1】:

    你在关注App Widgets Guide吗?我认为RemoteViews 不支持Switch 小部件。

    无论如何,由于您无法按需获取任何信息,因此您需要使用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>
    

    【讨论】:

    • 我不确定,我正在添加由我无法联系的其他人编写的代码。不过,我会看一下指南,如果有帮助,请告诉您。代码会很棒,谢谢
    猜你喜欢
    • 2021-06-11
    • 2018-09-01
    • 2011-12-19
    • 2020-10-19
    • 1970-01-01
    • 2021-02-16
    • 2011-09-09
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多