Homescreen Widget, Datum aktualisiert nicht

  • 5 Antworten
  • Letztes Antwortdatum
H

Heribert500

Ambitioniertes Mitglied
1
Maahlzeit,

in einem Widget auf dem Homescreen zeige ich Uhrzeit und Datum an.
Datum sepparat in einem Textview. Das korrekteDatum wird allerdings nur beim ersten Start des Widgets
angezeigt. es aktualiesiert sich leider nicht, auch nicht wenn ich im System das Datum verändere.
Was muss ich hier ändern?
Der Aufruf des Datums steht im onupdate ereigniss, funzt aber irgendwie nicht

Danke H500
Code:
public class UhrProvider extends AppWidgetProvider {
    private AlarmManager mAlarmManager;
    private Intent mIntent;
    private PendingIntent mPendingIntent;
    private static final String Testmodul    = "Uhr" +"\n"+ "Datum";
    Date date = Calendar.getInstance().getTime();
    String datum = new SimpleDateFormat("EEEE, dd.MM.yyyy").format(date);
    private static final SimpleDateFormat dateStyle = new SimpleDateFormat("HHmmss");
    private static int[] mDigits = {
            R.drawable.z0,
            R.drawable.z1,
            R.drawable.z2,
            R.drawable.z3,
            R.drawable.z4,
            R.drawable.z5,
            R.drawable.z6,
            R.drawable.z7,
            R.drawable.z8,
            R.drawable.z9
    };



    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        final int N = appWidgetIds.length;
        for(int i=0; i<N; i++){
            int appWidgetId = appWidgetIds[i];
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
        ComponentName watchWidget = new ComponentName(context, UhrProvider.class);

        remoteViews.setOnClickPendingIntent(R.id.LinearLayout1, getPendingSelfIntent(context, Testmodul));
        appWidgetManager.updateAppWidget(watchWidget, remoteViews);

        if (mAlarmManager == null) {
            mAlarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
            mIntent = new Intent();
            mIntent.setAction("de.hk.kleineuhr.SECONDS_UPDATE");
            mPendingIntent = PendingIntent.getBroadcast(context, 0, mIntent, 0);
            mAlarmManager.setRepeating(AlarmManager.RTC, (long) 0, (long) 1000, mPendingIntent);

        }



            Intent intent =new Intent(context,UhrProvider.class);
            PendingIntent pendingIntent =PendingIntent.getActivity(context, 0, intent, 0);
            // Hier holst du dir das Layout was du vorher erstellt hast (wo auch deine TextView dann drin ist) und weist der TextView den gewünschten Wert zu
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
            views.setTextViewText(R.id.text1, datum);

            // AppWidgetManager sagen das er ein update machen soll, damit deine Änderungen auch sichtbar werden
            appWidgetManager.updateAppWidget(appWidgetId, views);

        }

}


    @Override
    public void onReceive (Context context, Intent intent) {
        super.onReceive(context, intent);
        Date date = new Date();
        String actualTime = dateStyle.format(date);
        int one = Integer.parseInt("" + actualTime.charAt(0));
        int two = Integer.parseInt("" + actualTime.charAt(1));
        int three = Integer.parseInt("" + actualTime.charAt(2));
        int four = Integer.parseInt("" + actualTime.charAt(3));
        int five = Integer.parseInt("" + actualTime.charAt(4));
        int six = Integer.parseInt("" + actualTime.charAt(5));
        RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.main);

        rv.setImageViewResource(R.id.digit_one, mDigits[one]);
        rv.setImageViewResource(R.id.digit_two, mDigits[two]);

        rv.setImageViewResource(R.id.digit_three, mDigits[three]);
        rv.setImageViewResource(R.id.digit_four, mDigits[four]);

        rv.setImageViewResource(R.id.digit_five, mDigits[five]);
        rv.setImageViewResource(R.id.digit_six, mDigits[six]);


        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        ComponentName thisWidget = new ComponentName(context, UhrProvider.class);
        appWidgetManager.updateAppWidget(thisWidget, rv);


        if (Testmodul.equals(intent.getAction())) {


            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
            ComponentName watchWidget = new ComponentName(context, UhrProvider.class);

            appWidgetManager.updateAppWidget(watchWidget, remoteViews);
            Toast.makeText(context, Testmodul, Toast.LENGTH_LONG).show();

        }
    }

        protected PendingIntent getPendingSelfIntent(Context context, String action) {
            Intent intent = new Intent(context, getClass());
            intent.setAction(action);
            return PendingIntent.getBroadcast(context, 0, intent, 0);
        }




    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
        mIntent = new Intent();
        mIntent.setAction("de.hk.kleineuhr.SECONDS_UPDATE");
        mPendingIntent = PendingIntent.getBroadcast(context, 0, mIntent, 0);
        alarmManager.cancel(mPendingIntent);
    }

}
 
Hallo wie schaut den deine manifest aus ? Du solltest deinen Brodcast ja in einen receiver packen bzw. intent-filter ->
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
 
  • Danke
Reaktionen: Heribert500
Hi,
steht bereits so in der Manifest.
Was könnte sonst noch ein Problem sein?
Habe die Datumsanweisung mit in die onreceive Methode gepackt
Zumindest meckert die Konsole nicht, aber ist das zulässig?
Code:
@Override
    public void onReceive (Context context, Intent intent) {
        super.onReceive(context, intent);
        Date date = new Date();
        String actualTime = dateStyle.format(date);
        int one = Integer.parseInt("" + actualTime.charAt(0));
        int two = Integer.parseInt("" + actualTime.charAt(1));
        int three = Integer.parseInt("" + actualTime.charAt(2));
        int four = Integer.parseInt("" + actualTime.charAt(3));
        int five = Integer.parseInt("" + actualTime.charAt(4));
        int six = Integer.parseInt("" + actualTime.charAt(5));
        RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.main);
        RemoteViews txt = new RemoteViews(context.getPackageName(), R.layout.main);
        rv.setImageViewResource(R.id.digit_one, mDigits[one]);
        rv.setImageViewResource(R.id.digit_two, mDigits[two]);

        rv.setImageViewResource(R.id.digit_three, mDigits[three]);
        rv.setImageViewResource(R.id.digit_four, mDigits[four]);

        rv.setImageViewResource(R.id.digit_five, mDigits[five]);
        rv.setImageViewResource(R.id.digit_six, mDigits[six]);

        txt.setTextViewText(R.id.text1, datum);

        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        ComponentName thisWidget = new ComponentName(context, UhrProvider.class);
        appWidgetManager.updateAppWidget(thisWidget, rv);
        appWidgetManager.updateAppWidget(thisWidget, txt);


        if (Testmodul.equals(intent.getAction())) {


            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
            ComponentName watchWidget = new ComponentName(context, UhrProvider.class);

            appWidgetManager.updateAppWidget(watchWidget, remoteViews);
            Toast.makeText(context, Testmodul, Toast.LENGTH_LONG).show();

        }
    }

        protected PendingIntent getPendingSelfIntent(Context context, String action) {
            Intent intent = new Intent(context, getClass());
            intent.setAction(action);
            return PendingIntent.getBroadcast(context, 0, intent, 0);
        }

danke aber zunächst einmal

h500
 
Du kannst es so machen, ist aber nicht sehr praktisch.
Für eine einfache Uhr wäre es einfacher, alles in die update Methode zu schreiben. Diese wird ja schon periodisch aufgerufen. Der AlarmManager ist totaler Overhead.
Der Einsatz von PendingIntent's sollte man vermeiden. Sie werden nur für die Kommunikation zwischen verschieden Apps benutzt. Und die Kommunikation ist relativ öffentlich, jede andere App kann theoretisch mithören (oder schlimmeres).
 
  • Danke
Reaktionen: Heribert500
Code:
appWidgetManager.updateAppWidget(thisWidget, rv);
appWidgetManager.updateAppWidget(thisWidget, txt);

Das hier?! ICh habe die Doku mal angeschaut und da steht wenn du das Widget nur Teilweise updaten möchtest solltest du lieber
public void partiallyUpdateAppWidget () dafür callen und dabei folgendes beachten:

It is okay to call this method both inside an ACTION_APPWIDGET_UPDATE broadcast, and outside of the handler. This method will only work when called from the uid that owns the AppWidget provider.

This method will be ignored if a widget has not received a full update via updateAppWidget(int[], RemoteViews).

Hier die Doku für den Manager: AppWidgetManager | Android Developers
 
  • Danke
Reaktionen: Heribert500
Hallo und vielen Dank für eure Infos.
Wie ja erkennbar - bin ich Anfänger und lern und wissbegierig, noch jedenfalls.
In jedem Fall aber werde ich versuchen erhaltenene Tipps umzusetzen.

Danke
Heribert500
 
Zurück
Oben Unten