2012-03-30 4 views
5

Ich habe eine wirklich einfache Appwidget (zwei Textansichten und eine Schaltfläche). Ich habe es auf einem Touchpad, Droid 1 und einem Droid Razr getestet. Es funktioniert auf alles außer dem Razr. Wenn ich das Widget zum Startbildschirm hinzufüge, wird es nicht angezeigt. es ist nur unsichtbar. Wenn ich an der Stelle halte, wo es sein würde, wählt es ein Widget aus und wenn ich es umherbewege, sehe ich, dass andere Widgets aus dem Weg gehen, aber es ist komplett unsichtbar.Android AppWidget nicht auf bestimmten Handys

Ich habe einige Toasts in die onReceive und onEnabled Methoden und die Toast zeigt alle richtigen Informationen (dh Absicht Aktion und Extras).

Hat jemand irgendwelche Erfahrungen damit?

EDIT: Bitte beachten Sie dies nur für das Debuggen und folgt nicht Best Practices

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()'? Meinst du "onUpdate()" von deinem "AppWidgetProvider"? – CommonsWare

+0

Sie können auch die 'onReceive()' Methode in einem Appwidget überschreiben ... Ich denke, sie haben es in, weil frühere Versionen von Android hatte einige Probleme mit 'onDelete' – Eliezer

+0

Ich verstehe das. 'OnUpdate()' ist jedoch normalerweise der Ort, an dem Sie die 'RemoteViews' bereitstellen, um zu deklarieren, was in das App-Widget gehen soll. Wird 'onUpdate()' aufgerufen und liefern Sie erfolgreich die 'RemoteViews'? Gibt es irgendetwas in LogCat, das sich darauf beziehen könnte (z. B. Stapelspuren)? – CommonsWare

Antwort

1

Das Beste, was ich mir vorstellen kann (soll es nicht ein Fehler oder ein anderes Problem mit der Launcher der Razr) ist, dass Ihre Ressourcen nicht korrekt konfiguriert sind. Vielleicht hat das Razr eine andere dpi-Dichte und es gibt keine Ressourcen für diese Dichte in Ihrem Projekt.

Versuchen Sie zum Beispiel, alle Zeichenobjekte, aus denen Ihr Widget besteht, in den Ordner res \ drawable-nodpi zu verschieben und zu sehen, wie es geht.

EDIT: Ich sah etwas seltsam in Ihrem Code

In Ihrer GoogleTalkWidget Klasse OnReceive Methode wird das Widget nur dann aktualisiert, wenn die Nachricht Utils.RECEIVED_MESSAGE_WIDGET empfangen wird. Ich weiß nicht, was diese Nachricht ist, aber ein App-Widget, das erste Mal auf dem Startbildschirm hinzugefügt wird, empfängt es die android.appwidget.action.APPWIDGET_UPDATE und alle anderen Intent-Filter sind in der Manifest-Datei registriert und sie sind vom System zu dieser Zeit gesendet (und die Sticky Intents natürlich).

Wenn ich in Ihrer Position war, würde ich die OnReceive Methode wie folgt ändern:

@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); 
} 

und sehen, was passiert.

Wenn Ihr Widget nicht erscheint, dann könnte es ein Problem mit Razr sein, aber das ist anders, weil ich denke, dass eine ganze Reihe anderer Widgets gut funktioniert.

Obwohl Ihr Code nur zum Debuggen ist, ist Ihr Ansatz ein wenig problematisch. Der beste Ort zum Aktualisieren Ihrer Widget-Ansichten ist in der onUpdate-Methode des AppWidgetProvider und nicht in onReceive. Android stellt zu diesem Zweck die Methode onUpdate und onReceive zur Verfügung, um Sie darüber zu informieren, dass eine registrierte Übertragung angekommen ist. Der grundlegende Unterschied besteht darin, dass Android in der OnUpdate-Methode alle erforderlichen Parameter aus den empfangenen Intent-Extras extrahiert hat. Eine weitere Sache bei Widget-Updates ist, dass Sie einen android: updatePeriodMillis-Wert von 0 (2100000 ist ein guter Wert) in Ihrer Widget-XML-Datei angeben sollten, auch wenn Sie keine regelmäßigen Aktualisierungen für Ihr Widget wünschen. Ich habe irgendwo gesehen, dass die onReceive-Methode nicht aufgerufen werden kann, wenn dieser Wert 0 ist.

Beachten Sie auch, dass AppWidgetProvider als Broadcast-Empfänger nur so lange lebt, wie die onReceive-Methode ihren Job macht, danach ist es also zerstört ist kein guter Ort für "interaktiven" Code wie UI-Listener usw. Ich sage Ihnen das, weil Sie eine Button-Deklaration (Button sendMessage;) oben in Ihrer GoogleTalkWidget-Klasse haben.

Hoffe, das hilft ...

+0

Im Moment versuche ich nur, es zur Arbeit zu bringen, also seine sehr nackten Knochen .. .no Zeichensätze oder ähnliches .... nur eine Textansicht und Schaltfläche – Eliezer

+0

@Eliezer Siehe meine bearbeitete Antwort ... – Christos

+0

Was den Inhalt von 'onReceive' betrifft, habe ich diesen Beitrag nicht aktualisiert, seit ich ihn vergessen habe und ging weiter, als ich das Problem immer noch nicht lösen konnte. Seit ich die Frage gepostet habe, habe ich versucht, Teile des Codes herauszunehmen, bis ich nur ein 'onUpdate' hatte, das' super' heißt und das war es; funktionierte immer noch nicht. Wie bei 'OnUpdate' vs.' onReceive' habe ich nicht wirklich viel darüber nachgedacht, da dieses Projekt aufgrund dieses Problems mit dem Razr in den Hintergrund gedrängt wurde, aber Ihr Input wird geschätzt! – Eliezer