Обновление Android-виджета от активности

У меня есть виджет, его настройка так, что, когда я нажимаю на него, он открывает некоторые настройки в активности.

views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

Это настраивает некоторые настройки для приложения. Я хочу добиться того, чтобы виджет обновил свое представление, чтобы отразить измененные параметры, когда запуск Activity I закрывается. Использование интервала обновления или любого другого типа опроса не подходит для этого.

Я видел пару мест здесь и в андроидных документах, которые использовали этот код:

 appWidgetManager.updateAppWidget(mAppWidgetId, views); 

Но я не знаю, как получить значение mAppWidgetId. Я попробовал следующий пример для активности настройки виджета здесь: http://developer.android.com/guide/topics/appwidgets/index.html , но в следующем коде,

  Intent intent = getIntent(); Bundle extras = intent.getExtras(); if (extras != null) { mAppWidgetId = extras.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } 

Extras всегда равно null, поэтому я никогда не получаю AppWidgetID.

Хорошо, теперь я просто бессвязно. Как вы думаете, что я могу сделать?

Я, наконец, нашел ответ, который я искал, это было в перегрузке функции updateAppWidget.

  appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views); 

Это позволило мне получить доступ к виджету без необходимости знать идентификатор приложения. Мой последний код в моей деятельности:

  // Create an Intent to launch ExampleActivity Intent intent = new Intent(this, Settings.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views); finish(); 

Мне нужно сделать все тот же набор настроек, что и я должен был сделать в методе onUpdate Widget, но теперь каждый раз, когда я выхожу из своей активности, виджет отображает правильное состояние.

Есть еще один способ сделать это – передать идентификатор виджета в ожидающем намерения, которое вы используете для начала работы:

 Intent clickIntent=new Intent(context, MyConfigActivity.class); clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); // you have the widgetId here, since it's your onUpdate PendingIntent pendingIntent=PendingIntent .getActivity(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

Более того, чтобы избежать дублирования кода из onUpdate () , вы можете передать намерение обратно AppWidgetProvider:

 Intent intent = new Intent(this,MyAppWidgetProvider.class); intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); // Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID, // since it seems the onUpdate() is only fired on that: int[] ids = {widgetId}; intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); sendBroadcast(intent); 

Я знаю, что на это был дан ответ и принят раньше. Однако, пока я искал то же самое, я наткнулся на просто простой способ обновления виджета.

Для будущих читателей:

Наилучшая часть, это работает для всех экземпляров виджета и из любого контекста (Activity, Service и т. Д.),

Вот код,

 Context context = this; AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1); ComponentName thisWidget = new ComponentName(context, MyWidget.class); remoteViews.setTextViewText(R.id.my_text_view, "myText" + System.currentTimeMillis()); appWidgetManager.updateAppWidget(thisWidget, remoteViews); 

Предоставлено – застряло 🙂

Intereting Posts
Как реализовать гладкий ластик изображения в андроиде? Правильный способ обработки предупреждения NullPointerException от Android Studio Android ViewPager – Перекрытие фрагментов, когда ширина страницы установлена ​​на 90% Как получить доступ к ресурсам по ID в тесте Android? Когда вы получаете трассировку стека в Eclipse с классами SDK в стеке, как вы можете видеть источники SDK? Как установить фон сворачиваемой панели инструментов с пользовательским поведением, чтобы он соответствовал всему экрану Android IntentService не может создавать экземпляр класса; Нет пустого конструктора Использование HTC Wildfire для разработки Android Приложение IPhone / Android / WP7? Jfeinstein10 SlidingMenu: как остановить скользящее меню Android: как зарегистрировать мое приложение как «приложение для камеры» Как я могу избежать устаревших методов и поддерживать обратную совместимость? ADB не запускается (сообщение об ошибке отсутствует) Исключение, возникающее во время рендеринга: TabHost требует TabWidget с идентификатором «android: id / tabs» Как ускорить эмуляцию Android?