widgets tipos studio android widget uri android-appwidget android-imageview

tipos - android add widget



widget de aplicaciĆ³n setImageViewUri no actualiza la imagen (3)

Si el Uri permanece sin cambios, parece que Android no actualizará la imagen. Sin embargo, he encontrado un truco para solucionar esto. Simplemente llame a widget.setImageViewUri(R.id.widget_icon, Uri.parse("")); antes widget.setImageViewUri(R.id.widget_icon, uri); .

Llama a setImageViewUri() dos veces, pero parece estar funcionando bien. Sin embargo, me encantaría escuchar una mejor manera de solucionarlo, ya que estoy experimentando este problema yo mismo.

Tengo un widget de aplicación, que contiene solo una vista de imagen. vuelvo a dibujar esa imagen y la almaceno como PNG en la memoria privada de las aplicaciones y luego configuro la imagen de RemoteViews con el uri (widget.setImageViewUri (R.id.widget_icon, uri)) en lugar de enviar el mapa de bits en sí mismo, porque en muy raro situaciones que tengo !!! ¡TRANSACCIÓN BINDER NO FALLIDA!

el problema es que a medida que la imagen cambia con el tiempo, la imagen del widget no cambia. Comprobé el png guardado con el explorador de raíz y se actualiza correctamente. pero la imagen correcta no se muestra. cada widget muestra la imagen desde el momento en que se agregó a la pantalla de inicio. si uso setImageViewBitmap (...) funciona correctamente, excepto la rara transacción de enlace fallido.

Actualizo el widget de un servicio con el siguiente método. no funciona en Android 2.3.7 y también con emulador ejecutando 2.2. ¿Cual podría ser el problema? ¿está de alguna manera en caché?

public void updateWidget(Context context) { // redraws the widget''s image updateIcon(); OutputStream stream; try { stream = context.openFileOutput("icon.png", Context.MODE_WORLD_READABLE); } catch (FileNotFoundException ex) { ex.printStackTrace(); return; } m_Icon.compress(CompressFormat.PNG, 100, stream); try { stream.close(); } catch (IOException ex) { ex.printStackTrace(); } AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProvider.class)); Intent intent = new Intent(context, MyDialog.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent clickIntent = PendingIntent.getActivity(context, 0, intent, 0); File file = new File(context.getFilesDir().getAbsolutePath() + File.separator + "icon.png"); // Uri uri = Uri.fromFile(file); // update all widgets on home screen for (int wid : appWidgetIds) { RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget); widget.setOnClickPendingIntent(R.id.widget_layout, clickIntent); // === EDIT === // Uri.fromFile(file); does not work correctly on android 2.1, only 2.2 and up // widget''s image will disappear // widget.setImageViewUri(R.id.widget_icon, uri); widget.setImageViewUri(R.id.widget_icon, Uri.parse(file.getPath())); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, wid); appWidgetManager.updateAppWidget(wid, widget); } }

EDITAR: también probé un ContentProvider personalizado y establecí el uri "content: // ...", pero con el mismo resultado. el widget muestra la imagen desde el momento en que se agregó a la pantalla de inicio y no se actualiza con el tiempo.

logcat no muestra ningún error.


Bueno, parece que setImageViewUri almacena en caché las imágenes y no las actualiza si tienen el mismo nombre.

No es la solución más elegante, pero funciona, cada dos por tres usará un nombre de archivo diferente.

String filename = new String("bitmap-1.png"); // rotate files, due to not being refreshed if same name if ( context.deleteFile(filename) ) { filename = new String("bitmap-0.png"); } FileOutputStream out = context.openFileOutput(filename, Context.MODE_WORLD_READABLE); bitmap.compress(Bitmap.CompressFormat.PNG, 80, out); file = context.getFileStreamPath(filename); out.close(); updateViews.setImageViewUri(R.id.image1,Uri.parse(file.toString()));


Espero que esto ayude a los demás. Estaba intentando usar ese método en una vista de lista eliminada pero nunca funcionó. Pero el uso de bitmaps funcionó para mí. Pude actualizar las imágenes en cualquiera de los registros y estaban actualizando y no había almacenamiento en caché. Este es el método estático que utilicé.

public static Bitmap getBitmap( String imageLocation ) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.ARGB_8888; return BitmapFactory.decodeFile(imageLocation, options); }

entonces

bitmap = BitmapUtils.getBitmap( address.getPhotoLocation() ); row.setImageViewBitmap( R.id.row_image, bitmap );