1. Nimm jetzt an unserem Geotel Note - Gewinnspiel teil - Informationen zum Note findest Du hier!
  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.
     
Die Seite wird geladen...
Ähnliche Themen - Probleme bei Update Forum Datum
Verständnisprobleme beim Layout Android App Entwicklung 21.02.2017
Probleme beim Encoding einer Textdatei von Windows Android App Entwicklung 25.01.2017
[OFFEN] WebView Probleme Android App Entwicklung Freitag um 23:26 Uhr
[ERLEDIGT] Probleme mit Wear Modul Android App Entwicklung 01.05.2017
[OFFEN] Probleme mit SearchView in ArrayAdapter Android App Entwicklung 28.04.2017
Probleme mit NFC File Transfer Android App Entwicklung 21.01.2017
Layout-Probleme auf verschiedenen Geräten Android App Entwicklung 19.01.2017
AsyncTasks: "FTP Download" / "FTP liste Daten in Verzeichnis" Probleme Android App Entwicklung 16.01.2017
Rendering Probleme Unable to locate mode 0 (dirty solved) Android App Entwicklung 24.10.2016
Probleme mit Android-Studio Android App Entwicklung 07.08.2016