AW: Widget zu App hinzufügen
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?
AW: Widget zu App hinzufügen
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 ;-)
AW: Widget zu App hinzufügen
Dann poste doch deine Lösung oder den Ansatz, das hilft vielleicht anderen ;) :p
AW: Widget zu App hinzufügen
Zitat:
Zitat von
M@tze
Dann poste doch deine Lösung oder den Ansatz, das hilft vielleicht anderen ;) :p
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
Liste der Anhänge anzeigen (Anzahl: 1)
AW: Widget zu App hinzufügen
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:
Anhang 56731
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
AW: Widget zu App hinzufügen
Hat niemand eine Idee wieso das geschilderte Problem auftritt?
AW: Widget zu App hinzufügen
Habe das Problem nun gelöst, indem ich einen eigenen Intent sende, und per onReceive-Methode die onUpdate-Methode aufrufe.