2012-06-13 26 views
10

Tengo un widget con actividad de configuración. Cuando el usuario desea 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 allí está. Cuando reinstalo la aplicación, el widget se vuelve invisible. Todavía está allí, pero sin texto ni color. Ver img: enter image description hereWidget se vuelve invisible después de reinstalar

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

Ésta es la disposición de la acitivty configuración. No voy a publicar este xml. Tiene textviews en 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 puedo registrar 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 vista de 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 soy la creación de la disposición del widget. Dejé una línea con // para mostrar si la agrego, obtengo un widget sin fondo pero con el texto "Something".

¿Cómo se supone que establezca 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 debo hacer?

EDITAR

he encontrado this código y mina modificado como esto:

I añadió saveTitlePref(this, AppWidgetManager.INVALID_APPWIDGET_ID, widgettext); con el método onClick en el WidgetConfig.java, así que cuando el usuario presiona en OK en el acitivty configuración , el texto del widget se guardará con el appwidgetid (Idk what appwidgetid, ya que el código usa AppWidgetManager.INVALID_APPWIDGET_ID).

Para que esto funcione necesitaba 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 he modificado el bucle de esta manera:

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 añadí

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 está acercando. Coloco dos widgets con diferentes textos en la pantalla de inicio, luego vuelvo a instalar la aplicación. Ahora ambos widget tienen textos (por supuesto, desde que lo configuré), pero tienen el mismo texto, el que seleccioné para el segundo widget.

Por favor, ayúdame.

+0

¿No? No sabía que esta era una pregunta tan difícil. Vi aplicaciones con muchos widgets de conjunto de usuarios diferentes, entonces ¿qué debo hacer? – erdomester

+0

Ofrezco una recompensa de 100 créditos a cualquier persona que me diga cómo manejar widgets con la configuración establecida por el usuario en una actividad de configuración. – erdomester

+0

No tengo idea de esto, pero solo como una idea, ¿lo probaste en stock de Android? Tuve algunos problemas como este con sentido anterior. Esto podría ser un error específico de sentido que te engaña en la dirección equivocada – kishu27

Respuesta

-1

Cambiar el tamaño o mover el widget hace visible después de algún tiempo. Para solucionar esto, puse una imagen predeterminada en mi vista de imagen y funcionó para mí.

Cuestiones relacionadas