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:
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.
- El widget de comprobación se coloca en la pantalla de Android
- OnClick PendingIntent en widget a veces no funciona
- ¿Cómo iniciar una nueva actividad desde lockscreen?
- Desmarcando RadioButton - método alternativo
- Cómo quitar el relleno ImageButton de forma programática?
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.
- Coordenadas de la pantalla de inicio de Android y xy
- Estilos de widgets personalizados de Android: cómo colocarlos en un espacio de nombres?
- Actualización de Android Widget desde un clic de botón
- Android equivalente de UIWebView en Xcode
- ¿Cómo puedo crear un widget de aplicación de paginación de Android compatible con versiones anteriores?
- Android AutoCompleteTextView blanco en blanco Lista desplegable
- Android RemoteViews, ¿cómo configurar ScaleType de un ImageView dentro de un widget?
- Android: muestra la lista de contactos con el mismo número de teléfono
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í.
- Mensajería en la nube de Google con CCS
- ¿Cómo averiguar qué actividad está encima de la pila usando Robotium / Android SDK?