2012-03-30 10 views
5

Tengo un appwidget realmente simple (dos vistas de texto y un botón). Lo he probado en un Touchpad, Droid 1 y un Droid Razr. Funciona en todo excepto en Razr. Cuando agrego el widget a la pantalla de inicio, no se muestra; es simplemente invisible. Si mantengo presionado el lugar donde debería estar, selecciona un widget y si lo muevo, veo que otros widgets se mueven, pero es completamente invisible.Android AppWidget no se muestra en ciertos teléfonos

Pongo algunas tostadas en los métodos onReceive y onEnabled y el Toast muestra toda la información correcta (es decir, acción de intento y extras).

¿Alguien tiene alguna experiencia con esto?

EDIT: Por favor, tenga en cuenta que esto es sólo para la depuración y no sigue las mejores prácticas

public class GoogleTalkWidget extends AppWidgetProvider { 

    Button sendMessage; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Received Intent Action = " + 
       intent.getAction(), Toast.LENGTH_SHORT).show(); 

     if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){ 
      RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.main_widget); 

      views.setTextViewText(R.id.widget_message, 
       (CharSequence)intent.getStringExtra("MESSAGE")); 

      views.setTextViewText(R.id.widget_sender, 
       (CharSequence)intent.getStringExtra("SENDER")); 

      Toast.makeText(context, "Received " + 
       intent.getStringExtra("MESSAGE") + " FROM " + 
       intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show(); 

      ComponentName cn = new ComponentName(context, 
       GoogleTalkWidget.class); 

      AppWidgetManager.getInstance(context).updateAppWidget(cn, views); 

     } 
     super.onReceive(context, intent); 
    } 

    @Override 
    public void onEnabled(final Context context){ 
     super.onEnabled(context); 

     Toast.makeText(context, "Enabled", Toast.LENGTH_SHORT).show(); 
    } 

} 
+0

'onReceive()'? ¿Quiere decir 'onUpdate()' de su 'AppWidgetProvider'? – CommonsWare

+0

también puede anular el método 'onReceive()' en un appwidget ... Creo que lo dejaron porque las versiones anteriores de Android tenían algunos problemas con 'onDelete' – Eliezer

+0

Entiendo eso. Sin embargo, 'onUpdate()' generalmente es el lugar donde debe suministrar 'RemoteViews' para declarar qué debe ir en el widget de la aplicación. ¿Se llama a 'onUpdate()' y está suministrando con éxito 'RemoteViews'? ¿Hay algo en LogCat que pueda relacionarse (por ejemplo, restos de pila)? – CommonsWare

Respuesta

1

Lo mejor que se me ocurre (se supone que no es un error u otro problema con el lanzador de Razr) es que sus recursos no están configurados correctamente. Quizás el Razr tenga una densidad de dpi diferente y no haya recursos para esa densidad en su proyecto.

probar, por ejemplo para mover todos los dibujables que componen el widget a la res carpeta \ dibujable-nodpi y ver cómo va.

EDIT: vi algo extraño en su código

En el método de la clase OnReceive GoogleTalkWidget, el widget sólo se actualiza cuando se recibe el mensaje Utils.RECEIVED_MESSAGE_WIDGET. No sé para qué sirve este mensaje, sino un widget de aplicación, la primera vez que se agrega en la pantalla de inicio, recibe android.appwidget.action.APPWIDGET_UPDATE y cualquier otro filtro de intención se registra en el archivo de manifiesto y son emitido por el sistema en ese momento (y las intenciones de emisiones adhesivas, por supuesto).

Si yo estuviera en su posición de que cambiaría el método OnReceive de la siguiente manera:

@Override 
public void onReceive(Context context, Intent intent) { 
    Toast.makeText(context, "Received Intent Action = " + 
      intent.getAction(), Toast.LENGTH_SHORT).show(); 
    super.onReceive(context, intent); 

    String msg = "No messages yet"; 

    RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.main_widget); 

    if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){ 
     msg = intent.getStringExtra("MESSAGE"); 

     views.setTextViewText(R.id.widget_sender, 
      (CharSequence)intent.getStringExtra("SENDER")); 

     Toast.makeText(context, "Received " + 
      intent.getStringExtra("MESSAGE") + " FROM " + 
      intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show(); 

     ComponentName cn = new ComponentName(context, 
      GoogleTalkWidget.class); 
    } 

    views.setTextViewText(R.id.widget_message, msg); 

    AppWidgetManager.getInstance(context).updateAppWidget(cn, views); 
} 

y ver qué pasa.

Si tu widget no aparece, entonces podría ser un problema con Razr pero esto es a diferencia porque supongo que un montón de otros widgets funciona bien.

Además, aunque su código es solo para la depuración, su enfoque es un poco problemático. El mejor lugar para actualizar sus vistas de widget es en el método onUpdate de AppWidgetProvider y no en el onReceive. Android proporciona el método onUpdate para ese fin y el onReceive para informarle que ha llegado una transmisión registrada. La diferencia básica es que en el método onUpdate, Android ha extraído todos los parámetros necesarios de los extras de Intent recibidos. Una cosa más acerca de las actualizaciones de widgets es que debe proporcionar un valor android: updatePeriodMillis distinto de 0 (2100000 es un buen valor) en su archivo wml de widgets, incluso si no desea actualizaciones periódicas para su widget. Vi en algún lugar que el método onReceive no se puede llamar si este valor es 0.

Tenga en cuenta también que AppWidgetProvider como receptor de difusión solo vive mientras el método onReceive hace su trabajo, después de que se destruye por lo tanto no es un buen lugar para el código "interactivo", como los oyentes UI, etc. Te lo digo porque tienes una declaración de Button (botón sendMessage;) en la parte superior de tu clase GoogleTalkWidget.

Espero que esto ayude ...

+0

Ahora mismo estoy tratando de hacer que funcione, por lo que es muy básico ... .no dibujables ni nada por el estilo ... solo una vista de texto y el botón – Eliezer

+0

@Eliezer Ver mi respuesta editada ... – Christos

+0

En cuanto al contenido de 'onReceive' No he estado actualizando esta publicación porque me olvidé de ella y siguió adelante cuando todavía no podía resolver el problema. Desde que publiqué la pregunta, intenté quitar partes del código hasta que solo tuve un 'onUpdate' que llamaba' super' y eso fue todo; todavía no funcionó. En cuanto a 'onUpdate' vs' onReceive', no lo he pensado mucho, ya que este proyecto quedó en un segundo plano debido a este problema con Razr, pero se agradece su opinión. – Eliezer

Cuestiones relacionadas