Probleme bei Update eines Widgets per Activity

C

ChemDroid

Gast
Hallo zusammen,

ich habe folgendes Problem:

Ziel war es, eine bestehende App mit einem Widget zu versehen. Es geht dabei um die App "Static IP Toggle", die im Market verfügbar ist (Entwicklername: Chemdroid).

Diese App wechselt beim Starten zwischen DHCP und fester IP-Einstellung. Soll heißen:
App wird gestartet -> DHCP setting
App wird erneut gestartet -> static IP setting und so weiter.

Nun hatte mich ein User angefragt, dass es schön wäre, wenn es ein Widget zu meiner App gäbe, dass anzeigt, ob nun DHCP oder static IP gesetzt ist, dies habe ich nun folgendermaßen gelöst:

Hinzugefügte Texte im Bezug auf vorhergehende Version ohne Widget blau hervorgehoben.

Zunächst habe ich das Widget in der /AndroidManifest.xml deklariert:

Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.chemdroid.staticiptoggle" android:installLocation="internalOnly" android:versionName="1.2" android:versionCode="3"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".StaticIPToggle" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> [COLOR=blue]<receiver android:name=".Widget" android:label="@string/app_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget" /> </receiver>[/COLOR] </application> <uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
</manifest>
Dann habe ich den AppWidgetProvider deklariert in der Datei /xml/widget:

Code:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="72dp" android:minHeight="72dp" android:updatePeriodMillis="0" android:initialLayout="@layout/widget_dhcp">
</appwidget-provider>
2 Layouts wurden erstellt, eines für DHCP, eines für static IP. Darin enthalten war jeweils nur ein ImageButton mit dem jeweiligen Icon für DHCP oder static IP.

Widget.java wurde erstellt und dort zum einen, je nach Systemeinstellung, das Layout gewählt, und dann die Activity gestartet, die ein Umschalten der Konfiguration zur Folge hat:

Code:
package com.chemdroid.staticiptoggle;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.widget.RemoteViews;
public class Widget extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { int use_static_ip; RemoteViews remoteViews; try { use_static_ip = Settings.System.getInt(context.getContentResolver(), Settings.System.WIFI_USE_STATIC_IP); if (use_static_ip == 0) { //DHCP remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_dhcp); } else { //static IP remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_static); } Intent call_activity = new Intent(context, StaticIPToggle.class); PendingIntent pending_call_activity = PendingIntent.getActivity(context, 0, call_activity, 0); remoteViews.setOnClickPendingIntent(R.id.widget_icon, pending_call_activity); appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); } catch (SettingNotFoundException e) { e.printStackTrace(); } }
}
Zuletzt wurde die Activity noch angewiesen, nach Umstellung der Config das Widget zu updaten:

Code:
package com.chemdroid.staticiptoggle;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.provider.Settings.SettingNotFoundException;
import android.provider.Settings;
import android.widget.Toast;
public class StaticIPToggle extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int use_static_ip; try { --> Code für Änderung der Config [COLOR=blue]AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); ComponentName componentName = new ComponentName(getApplicationContext(), Widget.class); int[] ids = appWidgetManager.getAppWidgetIds(componentName); Intent update_widget = new Intent(); update_widget.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); update_widget.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); getApplicationContext().sendBroadcast(update_widget);[/COLOR] } catch (SettingNotFoundException e) { e.printStackTrace(); } finish(); }
}
Nun tritt folgendes Problem auf:

Wird das Widget angetippt, so erscheint für einen kurzen Zeitpunkt das Widget der Energiesteuerung, bevor das eigentliche Widget angezeigt wird.

Ein Screenshot von diesem Verhalten befindet sich im Anhang.

Ausgangspunkt ist das linke Bild, dann wird das Widget angetippt, das mittlere Bild bleibt für ca. eine halbe Sekunde, manchmal auch eine Sekunde lang aktuell. Danach erscheint das eigentliche Widget (rechtes Bild). Manchmal bleibt es auch beim mittleren Bild :-/

Leider finde ich keinen Fehler in meinem Code.

Kann mir jemand sagen, wo der (Denk)-Fehler liegt?
 

Anhänge

C

ChemDroid

Gast
Hat niemand eine Idee was das Problem sein könnte?
 
C

ChemDroid

Gast
Habe das Problem nun gelöst, indem ich einen eigenen Intent sende, und per onReceive-Methode die onUpdate-Methode aufrufe.
 
Oben Unten