Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Just update a widget RemoteViews instead of completly creating a new one?

So in my onUpdate method in my AppWidgetProvider class, I ended up executing a non-trivial amount of code so that I can completely recreate a new RemoteViews object. The reality is I really only need to be setting the text in one of the textviews in the RemoteViews each time I update. Is there anyway to just modify the RemoteViews that a particular widget is already using?

-Kurtis

like image 942
Kurtis Nusbaum Avatar asked Dec 25 '10 00:12

Kurtis Nusbaum


2 Answers

First, RemoteView is not a View. It's a set of instructions that build a View hierarchy. It is used to recreate a View in another process (App Widgets do not execute in your app's process). As such it's serializable and mutable.

So, when you initialize a RemoteView just store a reference to it somewhere, e.g. in a field of your custom AppWidgetProvider. Next time you need it, get it from field and the change something on it. For changing the string in a TextView use setString(..).

remoteView.setString(textViewId, "setText", "some text for TextView")
like image 136
Peter Knego Avatar answered Oct 26 '22 22:10

Peter Knego


This is the 2013 update if you are using current API's. In your WidgetProvider class' method that will perform an update:

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);

Note that it is no longer remoteView.setString but remoteView.setTextViewText

like image 37
Mark Lapasa Avatar answered Oct 26 '22 22:10

Mark Lapasa