Просто обновить виджет RemoteViews вместо того, чтобы полностью создать новый? - PullRequest
4 голосов
/ 25 декабря 2010

Итак, в моем методе onUpdate в моем классе AppWidgetProvider я в итоге выполнил нетривиальный объем кода, чтобы я мог полностью воссоздать новый объект RemoteViews.Реальность такова, что мне действительно нужно только устанавливать текст в одном из текстовых представлений в RemoteViews каждый раз, когда я обновляюсь.В любом случае можно просто изменить RemoteViews, которые уже используется конкретным виджетом?

-Kurtis

Ответы [ 3 ]

17 голосов
/ 12 октября 2011

Во-первых, RemoteView не является представлением.Это набор инструкций, которые строят иерархию View.Он используется для воссоздания представления в другом процессе (виджеты приложения не выполняются в процессе вашего приложения).Таким образом, он сериализуем и изменчив.

Итак, когда вы инициализируете RemoteView, просто сохраните ссылку на него где-нибудь, например, в поле вашего пользовательского AppWidgetProvider.В следующий раз, когда вам это нужно, возьмите его с поля и что-нибудь измените.Для изменения строки в TextView используйте setString(..).

remoteView.setString(textViewId, "setText", "some text for TextView")
17 голосов
/ 28 августа 2013

Это обновление 2013 года, если вы используете текущие API.В методе класса WidgetProvider, который будет выполнять обновление:

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
rv = new RemoteViews(context.getPackageName(), R.layout.widgetlayout); 
rv.setTextViewText(R.id.ofTextViewInWidgetLayoutXML, "Hello World");
appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], rv);

Обратите внимание, что это уже не remoteView.setString, а remoteView.setTextViewText

0 голосов
/ 25 декабря 2010

Вы можете обновить удаленные виды и затем позвонить

ComponentName componentName= new ComponentName(context, YourClass.class);
AppWidgetManager.getInstance(context).updateAppWidget(componentName, remoteViews);

на котором AFAIK должен обновить виджет

...