Widget-Icon aktualisiert sich nicht

  • Hallo,


    ich bin noch sehr neu in der App-Programmierung und mache gerade ein Buch darüber durch. Nun bin ich dort schon beim Thema "Widget programmieren". Das Widget an sich läuft wunderbar, nur das Icon aktualisert sich nicht. Es handelt sich um ein Widget, um den Ton beim Telefon stumm/laut zu schalten. Und je nach Zustand soll sich das Icon des Widgets aktualiseren.


    Wenn ich den Modus direkt durchs Klicken auf das Widget ändere, wechselt auch das Icon. Nur wenn in die App selbst reingehe und dort den Modus ändere, ändert sich nicht das Icon vom Widget. Als Intervall für die Aktualisierung habe ich 1 Minute angegeben:

    Code
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"    android:minWidth="79px"    android:minHeight="79px"    android:updatePeriodMillis="6000"    android:initialLayout="@layout/widget"/>



    Und hier noch der Code der Java-Klasse, falls diese benötigt wird:

    Java
    public class AppWidget extends AppWidgetProvider {    @Override    public void onReceive(Context context, Intent intent) {        if (intent.getAction() == null) {            context.startService(new Intent(context, ToggleService.class));        } else {            super.onReceive(context, intent);        }    }
        @Override    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {        context.startService(new Intent(context, ToggleService.class));    }
        public static class ToggleService extends IntentService {        public ToggleService() {            super(ToggleService.class.getName());        }
            @Override        protected void onHandleIntent(Intent intent) {            ComponentName me = new ComponentName(this, AppWidget.class);            AppWidgetManager mgr = AppWidgetManager.getInstance(this);            mgr.updateAppWidget(me, buildUpdate(this));        }
            private RemoteViews buildUpdate(Context context) {            RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget);            AudioManager audioManager = (AudioManager)context.getSystemService(Activity.AUDIO_SERVICE);
                if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {                updateViews.setImageViewResource(R.id.phoneState, R.drawable.phone_state_normal);                audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);            } else {                updateViews.setImageViewResource(R.id.phoneState, R.drawable.phone_state_silent);                audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);            }
                Intent i = new Intent(this, AppWidget.class);            PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);            updateViews.setOnClickPendingIntent(R.id.phoneState, pi);
                return updateViews;        }    }}



    Ich hoffe, ihr könnt mir weiterhelfen, da es wirklich nur ein kleines Problem ist (hoffe ich doch mal ;) ).


    Liebe Grüße
    tööö


    Irgendwie ist der Code in der Vorschau an einem Stück, ohne Zeilenumbrüche, wie kann ich das denn lesbarer darstellen?

  • Den Code bekommst Du lesbarer hin, wenn Du im Editor in die Quelltext Ansicht wechselst, ihn dort einfügst und das Ganze dann abschickst.


    Vielleicht sehe ich dann auch, wo Du die Abfrage des Telefonstatus und die dazugehörige Anpassung des Widgets vornimmst. ;)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • So, dann hier nochmal der zweite Versuche, sieht zwar immer noch nicht optimal aus, aber besser als vorher. O:-)


    Wie gesagt, das Widget an sich geht und beim Draufklicken auf dem Widget selbst ändert sich auch das Icon. Nur wenn ich den Lautstärke-Modus direkt über die App ändere, ändert sich nach einer Minute (wie in der XML angegeben) nicht das Icon des Widgets.


    Code
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    	android:minWidth="79px"
    	android:minHeight="79px"
    	android:updatePeriodMillis="6000"
    	android:initialLayout="@layout/widget"/>



    Wahrscheinlich eine ganz einfache Sache, die ich einfach noch nicht weiß. ;)

  • Ich sehe jetzt zwar nicht, wo Du da den Modus umstellst, aber egal.


    Hast Du Dich mal mit dem Debugger reingehängt und nach der Minute geprüft, welchen Wert der AudioManager hat?
    Für mich sieht das Ganze übrigens so aus, als würde immer Deine buildUpdate Methode aufgerufen sobald ein Intent rein kommt.


    Also entweder kommt kein Intent rein (Service falsch programmiert) oder es kommt ein Intent rein.
    Dann müsste Dein Intent kommen, wenn Du den Status manuell auf 'lautlost' stellst. Es wird dann buildUpdate aufgerufen und der Status automatisch auf 'normal' gestellt. Ergo kann sich die Ansicht auch nicht ändern.
    Genau so geht es auch auf der anderen Seite. Wenn Du den Status manuell von 'lautlos' auf 'normal' stellst, wird buildUpdate aufgerufen und der Status automatisch auf 'lautlos' gestellt. Auch hier ist keine Änderung sichtbar.


    Vermutlich trennst Du nicht richtig zwischen Update nach Timeout und Klick auf das Widget.


    Da kommst Du aber nur mit dem Debugger weiter. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Ahh, ich verstehe. Richtig, ich trenne da gar nicht zwischen Update nach Timeout und Klick auf das Widget, du hast Recht. Das war eben ein Beispiel von einem Buch und ich dachte, ich probiere es einfach mal aus und habe erwartet, dass es auch funktioniert, wenn ich den Status NICHT über das Widget änder, dass sich dann trotzdem das Symbol vom Widget ändert. Aber wenn ich mir den Code von buildUpdate genauer anschaue, kann das ja gar nicht funktionieren. ;)
    Das Beispiel ist dann wohl nur darauf ausgelegt, dass man über das Widget den Status ändert, was ja auch wunderbar funktioniert.


    Was müsste man denn ganz grob gesagt noch implementieren, damit sich das Widget-Symbol auch ändert, wenn man manuell von lautlos auf normal (oder andersrum) einstellt?


    Die buildUpdate-Funktion wird (wenn ich deinen Post richtig verstehe), beim TimeOut, aber auch beim Klick aufgerufen, richtig? Ich stehe da gerade echt aufm Schlau, wie ich die Funktion anpassen sollte, dass das auch mit dem TimeOut klappt.

  • Ich steck' nicht tief genug drin um Dir zu sagen, wann was wie warum ausgeführt wird.
    Deshalb solltest Du ja den Debugger benutzen.


    Wichtig ist zu wissen, wann die onReceive aufgerufen wird und was im Intent steht.


    Du kannst Dein Intent dann so erweitern, dass es auf Broadcasts reagiert. Oder was auch immer die Änderung der Lautstärke so triggert.
    Ich glaube, das ist die RINGER_MODE_CHANGED_ACTION

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Jetzt habe ich mal versucht, mit dem Debugger da durchzugehen, aber nach ein paar Sekunden kommt dann in der View "Variables" ein "Disconnected from the target VM". Ich benutze Android Studio.


    Naja, hätte ja sein können, dass es nur ein kleines Problem ist, wollte mich damit nun auch nicht mehr lange aufhalten, da es gerade für mich nicht so wichtig ist. War wohl wie gesagt vom Buch nicht so vorgesehen.


    Trotzdem Danke für deine Mühe! :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!