Widget se vuelve invisible después de reinstalar

Tengo un widget con la actividad de configurar. Cuando el usuario quiere colocar el widget en la pantalla de inicio, se abre la actividad de configuración, el usuario selecciona el contenido, el color de fondo y el color del texto del widget y está allí. Cuando vuelvo a instalar la aplicación, el widget se vuelve invisible. Todavía está allí, pero sin texto ni color. Vea img: Introduzca aquí la descripción de la imagen

Voy a publicar todos mis archivos, y al final, le diré cuál puede ser el problema. Lo que no sé es la solución.

Widgetconfigure.xml

Este es el diseño de la configuración acitivty. No voy a publicar este xml. Tiene vistas de texto en los diseños.

Widget_layout.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="72dip" android:layout_height="72dip" android:layout_gravity="center" android:id="@+id/widgetlayout"> <ImageView android:id="@+id/ImageView01" android:layout_width="72dip" android:layout_height="72dip" android:scaleType="fitXY"> </ImageView> <TextView android:id="@+id/tvConfigInput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:gravity="left" android:textColor="#FFFFFF" android:layout_marginLeft="3dip" android:layout_marginRight="3dip" android:textSize="12dip" /> </RelativeLayout> 

Parte del manifiesto donde registro mi actividad de configuración y el appwidgetprovider:

  <activity android:name=".WidgetConfig" android:label="@string/app_name" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </intent-filter> </activity> <receiver android:name=".MyWidgetProvider" android:label="@string/app_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info"></meta-data> </receiver> 

Xml / widget_info.xml

 <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget_layout" android:minHeight="72dp" android:minWidth="72dp" android:configure="com.b2creative.notepad.WidgetConfig"> </appwidget-provider> 

WidgetConfig.java

Esta es la actividad de configuración. El usuario selecciona el fondo y el color del texto del widget y el texto de una lista para que aparezca en el widget. Voy a publicar sólo la parte relevante:

  AppWidgetManager awm; int awID; Intent i = getIntent(); Bundle extras = i.getExtras(); if (extras != null) { awID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } else { finish(); } awm = AppWidgetManager.getInstance(c); //the code from here is in a button onclicklistener that sets the widget. RemoteViews views = new RemoteViews(c.getPackageName(), R.layout.widget_layout); views.setTextViewText(R.id.tvConfigInput, widgettext); views.setTextColor(R.id.tvConfigInput, loadedtextcolor); views.setFloat(R.id.tvConfigInput, "setTextSize", int_widgetfontsize); Paint p = new Paint(); p.setAntiAlias(true); p.setStyle(Style.FILL); p.setColor(loadedbgcolor); Bitmap bitmap = Bitmap.createBitmap(GetDipsFromPixel(72), GetDipsFromPixel(72), Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); RectF rect = new RectF(0, 0, GetDipsFromPixel(72), GetDipsFromPixel(72)); canvas.drawRoundRect(rect, 10, 10, p); views.setImageViewBitmap(R.id.ImageView01, bitmap); Intent in = new Intent(c, Notepad.class); PendingIntent pi = PendingIntent.getActivity(c, 0, in, 0); Intent result = new Intent(); result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID); setResult(RESULT_OK, result); awm.updateAppWidget(awID, views); finish(); 

MyWidgetProvider.java

 public class MyWidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); final int N = appWidgetIds.length; for (int i=0; i<N; i++) { int awID = appWidgetIds[i]; RemoteViews v = new RemoteViews(context.getPackageName(), R.layout.widget_layout); //v.setTextViewText(R.id.tvConfigInput, "Something"); appWidgetManager.updateAppWidget(awID, v); } } @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); } } 

Así que estoy bastante seguro de que el problema está aquí en el método onUpdate, ya que no estoy configurando el diseño del widget. Dejé una línea con // para mostrar si la agrego, obtengo un widget sin fondo pero con el texto "Algo".

¿Cómo se supone que debo establecer el color de fondo, el textcolor del widget y el texto de TextView en el widget en este método? No los conozco, el usuario los establece al agregar el widget. ¿O qué se supone que tengo que hacer?

EDITAR

He encontrado este código y modificó el mío como este:

He añadido saveTitlePref(this, AppWidgetManager.INVALID_APPWIDGET_ID, widgettext); Al método onClick en el WidgetConfig.java, por lo que cuando el usuario presiona OK en la configuración acitivty, el widgettext se guardará con el appwidgetid (Idk qué appwidgetid, ya que el código utiliza AppWidgetManager.INVALID_APPWIDGET_ID).

Para que esto funcione necesité esto:

  static void saveTitlePref(Context context, int appWidgetId, String text) { SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit(); prefs.putString(PREF_PREFIX_KEY + appWidgetId, text); prefs.commit(); } 

En la clase MyWidgetProvider modifiqué el bucle for así:

 final int N = appWidgetIds.length; for (int i=0; i<N; i++) { int awID = appWidgetIds[i]; RemoteViews v = new RemoteViews(context.getPackageName(), R.layout.widget_layout); //v.setTextViewText(R.id.tvConfigInput, "Something"); v.setTextViewText(R.id.tvConfigInput, loadTitlePref(context, AppWidgetManager.INVALID_APPWIDGET_ID)); appWidgetManager.updateAppWidget(awID, v); } 

Donde agregué

  static String loadTitlePref(Context context, int appWidgetId) { SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0); String prefix = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null); String nothing = "empty"; if (prefix != null) { return prefix; } else { return nothing; } } 

Todavía no funciona, pero se acerca. Coloco dos widgets con diferentes textos en la pantalla de inicio, luego vuelvo a instalar la aplicación. Ahora ambos widgets tienen textos (por supuesto, desde que lo configuré), pero tienen el mismo texto, el que seleccioné para el 2º widget.

Por favor, ayúdame.

Si la imagen se almacena en la tarjeta SD, esta entrada podría tener la respuesta: http://www.technipages.com/android-icons-disappear-from-home-screen.html

Un buen enfoque podría ser la asignación / guardar cada Id en sharedPrefs. Más información aquí: Manejo de múltiples instancias de appwidget y aquí: http://www.androidbook.com/akc/display?url=DisplayNoteIMPURL&reportId=3307&downerUserId=satya

Reajustar o mover el widget lo hace visible después de algún tiempo. Para arreglar esto, pongo una imagen predeterminada en mi vista de imagen y funcionó para mí.

  • Cómo actualizar un Widget dinámicamente (No esperar 30 min para que onUpdate se llame)?
  • Android - widget de acordeón
  • Cómo agregar widgets múltiples en una aplicación?
  • Lista de contactos con contacto La foto crea problemas de rendimiento
  • El fondo del widget de Android no aparece, no responde
  • ¿Usando un ToggleButton en un widget?
  • Mostrar widgets en la vista de mapa
  • No se puede iniciar el servicio con null
  • Obtener preferencias en AppWidget Provider
  • Cuadro de selección alrededor de android.support.v7.widget.SwitchCompat
  • Android 3.0, Vista previa de widgets
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.