Multiple instances of Android widget update only the latest widget

I tried to solve my problem using the link

update - I realized that something is wrong with the installer of the expecting intent - every time I click on the image - the intent sends the details of the last installed widget - that other expecting intentions, which, if defined in pre-added widgets, were launched by newer widgets

I have an application widget that displays an image selected by the user. (many widgets - many images) my problem: no matter which widget I click on the screen, only the last added widget is updated: here is my code

The code of my xml widget provider

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget_Test" android:minHeight="146dip" android:minWidth="146dip" android:updatePeriodMillis="0" /> 

My manifest xml code

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.BIND_REMOTEVIEWS" > </uses-permission> <application android:icon="@drawable/icon" android:label="@string/app_name" > <activity android:name=".Activities.WidgetConfig" android:screenOrientation="portrait" > <!-- prbbly delete this line --> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </activity> <!-- Test Widget --> <receiver android:name=".Simple.Widget" android:label="@string/app_widget_Test" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_Test_provider" /> </receiver> <service android:name=".Simple.Widget$TestWidgetService" /> </application> </manifest> 

Widget provider

 public class Widget extends AppWidgetProvider { public static String PREFENCES_WIDGET_CONFIGURE = "ActionConfigureWidget"; public static int[] widgets; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { Intent svcIntent = new Intent(context, TESTWidgetService.class); widgets = appWidgetIds; context.startService(svcIntent); } public static class TESTWidgetService extends Service { @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); // Update the widget RemoteViews remoteView = buildRemoteView(this); // Push update to homescreen Mngr.getInstance().pushUpdate(remoteView, getApplicationContext(), Widget.class); // No more updates so stop the service and free resources stopSelf(); } public RemoteViews buildRemoteView(Context context) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_TEST); if (widgets != null) { int length = widgets.length; for (int i = 0; i < length; i++) { Intent configIntent = new Intent(context, WidgetConfig.class); configIntent.setAction(Widget.PREFENCES_WIDGET_CONFIGURE); String number = AppWidgetManager.EXTRA_APPWIDGET_ID + "number"; configIntent.putExtra(number, length); String widgetID = AppWidgetManager.EXTRA_APPWIDGET_ID + i; int id = widgets[i]; configIntent.putExtra(widgetID, id); PendingIntent runTESTPendingIntent = PendingIntent .getActivity(context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.TESTWidgetImage, runTESTPendingIntent); Mngr controller = Mngr.getInstance(); controller.updateTESTWidget(context, remoteViews); } } return remoteViews; } @Override public void onConfigurationChanged(Configuration newConfig) { int oldOrientation = this.getResources().getConfiguration().orientation; if (newConfig.orientation != oldOrientation) { // Update the widget RemoteViews remoteView = buildRemoteView(this); // Push update to homescreen Mngr.getInstance().pushUpdate(remoteView, getApplicationContext(), Widget.class); } } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } } } 

my configuration

 public class WidgetConfig extends ListActivity // implements { private Bundle m_extras; private ArrayList<Test> m_tests = null; private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; ImageAdapter m_adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.imagelist); Resources res = getResources(); Mngr mngr = Mngr.getInstance(); mngr.setResources(res); Context ctx = getApplicationContext(); mngr.setContext(ctx); getTests(); m_adapter = new ImageAdapter(ctx, R.layout.row, m_tests); ImageDownloader.Mode mode = ImageDownloader.Mode.CORRECT; m_adapter.getImageDownloader().setMode(mode); setListAdapter(m_adapter); Intent intent = getIntent(); m_extras = intent.getExtras(); } private void getTests() { m_tests = new ArrayList<Test>(); Resources res = getResources(); String[] TestNames = res.getStringArray(R.array.fav_Test_array); TypedArray imgs = getResources().obtainTypedArray( R.array.fav_Test_integer); for (int i = 0; i < TestNames.length; i++) { Test o1 = new Test(); String TestName = TestNames[i]; int resID = imgs.getResourceId(i, -1); o1.setTestName(TestName); o1.setIMGID(resID); m_tests.add(o1); } imgs.recycle(); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { ListAdapter adapt = l.getAdapter(); Object obj = adapt.getItem(position); if (obj != null) { Mngr mngr = Mngr.getInstance(); Context context = getApplicationContext(); String key = context.getString(R.string.TestWidget_string) + "_" + AppWidgetManager.EXTRA_APPWIDGET_ID; Test Test = (Test) obj; String val = Test.getIMGID().toString(); mngr.putString(context, key, val); updateWidget(); } super.onListItemClick(l, v, position, id); } private void updateWidget() { Context ctx = getApplicationContext(); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(ctx); setResult(RESULT_CANCELED); if (m_extras != null) { Intent resultValue = new Intent(); int numberOfWidgets = m_extras.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID + "number", AppWidgetManager.INVALID_APPWIDGET_ID); for (int i = 0; i < numberOfWidgets; i++) { String stringID = AppWidgetManager.EXTRA_APPWIDGET_ID + i; mAppWidgetId = m_extras.getInt(stringID, AppWidgetManager.INVALID_APPWIDGET_ID); /*************************************************************/ /*I Don't really know if I am using this piece of code right */ Uri data = Uri.withAppendedPath(Uri.parse("ABCD" + "://widget/id/"), String.valueOf(mAppWidgetId)); resultValue.setData(data); /*************************************************************/ RemoteViews views = new RemoteViews(ctx.getPackageName(), R.layout.widget_Test); Mngr.getInstance().updateTestWidget(ctx, views); appWidgetManager.updateAppWidget(mAppWidgetId, views); resultValue.putExtra(stringID, mAppWidgetId); } setResult(RESULT_OK, resultValue); finish(); } } } 

My Mngr Code

 public void updateTestWidget(Context context, RemoteViews remoteViews) { String key = context.getString(R.string.TestWidget_string) + "_" + AppWidgetManager.EXTRA_APPWIDGET_ID; String s = getString(context, key, ""); if (s != null && s.equals("") == false) { int resID = Integer.valueOf(s); remoteViews.setImageViewResource(R.id.TestWidgetImage, resID); } } public void pushUpdate(RemoteViews remoteView, Context ctx, Class<?> cls) { ComponentName myWidget = new ComponentName(ctx, cls); AppWidgetManager manager = AppWidgetManager.getInstance(ctx); manager.updateAppWidget(myWidget, remoteView); } 
+4
source share
2 answers

The problem is not in your configuration, the problem is in your widgetProvider. I had the same problem as yours, but was resolved using the link provided . You need to set the “hacked” intent to your configIntent in buildRemoteView.

+3
source

I had the same problem when I tested my application on emulator version 2.2 or 2.3. On a real device, everything should work fine. Moreover, in my case, emulator 4.0 worked correctly. In any case, I recommend that you test it on a real device.

0
source

Source: https://habr.com/ru/post/1397220/


All Articles