1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Probleme bei Update eines Widgets per Activity

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ChemDroid, 27.12.2010.

  1. ChemDroid, 27.12.2010 #1
    ChemDroid

    ChemDroid Threadstarter 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) {
                // TODO Auto-generated catch block
                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 {
        /** Called when the activity is first created. */
        @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) {
                // TODO Auto-generated catch block
                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:

  2. ChemDroid, 06.01.2011 #2
    ChemDroid

    ChemDroid Threadstarter Gast

    Hat niemand eine Idee was das Problem sein könnte?
     
  3. ChemDroid, 10.01.2011 #3
    ChemDroid

    ChemDroid Threadstarter Gast

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

Diese Seite empfehlen