Widget zu App hinzufügen Widget zu App hinzufügen
Ergebnis 1 bis 8 von 8
  1. User66586 Gast
    Hallo zusammen,

    ich habe da ein kleines Problemchen, und zwar habe ich ne kleine App geschrieben um mich mit Widgets vertraut zu machen.
    Diese App zeigt beim Starten in einem EditText einen Text an.

    Nun habe ich versucht ein Widget hinzuzufügen, was beim antippen die Activity startet (also genauso, als würde man die App direkt starten). Auf dieser Methode will ich später eine andere App aufbauen, die beim antippen das Widget-Icon ändert.

    Leider wird das Programm beim erstellen des Widgets auf dem Homescreen gezwungenermaßen beendet (Die Anwendung... wurde unerwartet beendet).

    Hier mal die nötigen Sourcecodes:

    WidgetHello.java

    Code:
    package com.test.widgethello;
    
    import android.app.Activity;
    import android.app.PendingIntent;
    import android.appwidget.AppWidgetManager;
    import android.appwidget.AppWidgetProvider;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.EditText;
    import android.widget.RemoteViews;
    
    public class WidgetHello extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            EditText et_hello = (EditText) findViewById(R.id.et_hello);
            et_hello.setText("Hallo Du da!");
        }
        
    class WidgetUpdate extends AppWidgetProvider {
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
            final int N = appWidgetIds.length;
            for (int i = 0; i < N; i++) {
                int appWidgetId = appWidgetIds[\i];  <-- Kommentar-Forum: Escape vor i, weil sonst BB-Code für Kursiv eingeleitet und damit code-Tag nicht ohne Fehler! Escape im Quelltext nicht vorhanden!!!
                Intent intent = new Intent(context, WidgetHello.class);
                PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
                RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidgetlayout);
                views.setOnClickPendingIntent(R.id.Button01, pendingIntent);
                appWidgetManager.updateAppWidget(appWidgetId, views);
            }
        }
    }
    }
    AndroidManifest.xml

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.test.widgethello"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
           <activity android:name=".WidgetHello"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            
            <receiver android:name="WidgetUpdate" >
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                </intent-filter>
                <meta-data android:name="android.appwidget.provider"
                           android:resource="@xml/appwidget" />
            </receiver>
    
        </application>
        <uses-sdk android:minSdkVersion="8" />
        
    </manifest>
    xml/appwidget.xml

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider
      xmlns:android="http://schemas.android.com/apk/res/android"
          android:minWidth="294dp"
        android:minHeight="72dp"
        android:updatePeriodMillis="60000"
        android:initialLayout="@layout/appwidgetlayout" >
    </appwidget-provider>
    xml/appwidgetlayout.xml

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
    <Button android:text="Start" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    </LinearLayout>
    Wäre schön, wenn mir jemand weiterhelfen könnte

    Gruß Oli
    0
     

  2. 23.12.2010, 10:11
    #2
    Ohne mir den Code angeschaut zu haben und ohne je mit Widgets gearbeitet zu haben, ohne Logcat-Fehlermeldungen wird es schwierig dir zu helfen. Also: Was sagt Logcat?
    0
     

  3. User66586 Gast
    Hi, danke für deinen Hinweis, aber ich habe das Problem mit einiger Recherche mittlerweile lösen können und die bestehende App mit einem funktionierenden Widget versehen

    Gruß Oli

    ...und frohe Weihnachten
    0
     

  4. Dann poste doch deine Lösung oder den Ansatz, das hilft vielleicht anderen
    0
     

  5. User66586 Gast
    Zitat Zitat von M@tze Beitrag anzeigen
    Dann poste doch deine Lösung oder den Ansatz, das hilft vielleicht anderen
    Das hatte ich auch vor jedoch gestern, aus wohlbekannten Gründen , nicht so die Zeit das auch zu tun.
    Das hole ich jetzt nach.

    Also, hier mal ein kleines HowTo für mein 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>
            
            <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>
    
        </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
    
    			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);
    		} catch (SettingNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
            finish();
        }
    }
    Das Update wird die Tage veröffentlicht.

    Gruß Oli
    1
     

  6. User66586 Gast
    Hallo nochmals,

    leider fiel mir und einem anderen Nutzer bei der Nutzung des Widgets noch folgendes Problem auf:

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

    Hier ein Screenshot von diesem Verhalten:

    Widget zu App hinzufügen-screen.png

    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).

    Leider finde ich keinen Fehler in meinem Code (siehe voriger Post).

    Was meint ihr dazu?

    Gruß Oli
    0
     

  7. User66586 Gast
    Hat niemand eine Idee wieso das geschilderte Problem auftritt?
    0
     

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

Ähnliche Themen

  1. Kontakt hinzufügen (Verknüpfung / Widget)
    Von Xerox3 im Forum Android Apps
    Antworten: 5
    Letzter Beitrag: 05.01.2012, 18:23
  2. Antworten: 4
    Letzter Beitrag: 30.10.2010, 15:03
  3. HTC nachrichten widget (sms widget)
    Von rexx im Forum HTC Desire Kommunikation
    Antworten: 2
    Letzter Beitrag: 29.08.2010, 07:53
  4. Kontakt-Widget: ich kann keine Kontakte hinzufügen
    Von mentos6 im Forum HTC Legend
    Antworten: 7
    Letzter Beitrag: 10.06.2010, 00:14
  5. Verknüpfungs Widget Shortcuts hinzufügen nicht möglich
    Von Tiilt im Forum Samsung Omnia II
    Antworten: 2
    Letzter Beitrag: 17.11.2009, 19:42

Besucher haben diese Seite mit folgenden Suchbegriffen gefunden:

android widget

android appwidget activity aufrufen

android widget erstellen

http:www.pocketpc.chandroid-entwicklung115722-widget-app-hinzufuegen.html

android widget und app

android widget entwickeln

Android Widget programmieren

widget erstellen android

widget android erstellen

app widget erstellen

widgets android

appwidget receiver

widget android entwicklung

android apps hinzufügenWidget erstellen android apiandroid widgets erstellenandroid java widget erstellenandroid appwidget onupdate wird nicht ausgeführtwidget aus app erstellenandroid entwicklung icon für startbildschirm erstellenandroid widget für bestehende app programmierenandroid appwidget activity receiverwidget aus app machenandroid widget app erstellenandroid application context

Stichworte