Widget Button OnClick Toast

  • 3 Antworten
  • Letztes Antwortdatum
Feelix333

Feelix333

Stamm-User
349
Hallo zusammen,

Ich möchte vorerst ein ganz einfaches Android Widget erstellen.
Es enthält nur einen Button der bei klick daraus einen Toast ausgibt.

Innerhalb einer App kein Problem, nur als Widget scheint das mit
"onUpdate" und "onReceive" wieder ganz anders zu funktionieren.. :sad:

Ein Widget mit einem Standard Button habe ich schon erstellt - bei der Funktion beiße ich mit trotz Stackoverflow, etc die Zähne aus.

Ich hoffe ich könnt mir helfen!

Nach gefühlten 1000 Versionen, sieht der Code in der Widget.java so aus:

Code:
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];
	
          Intent intent = new Intent(context, Provider.class);
            intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            Intent clickIntent = new Intent(context, Provider.class);
            clickIntent.setAction(BUTTON_CLICK);  
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
	
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main);
            views.setOnClickPendingIntent(R.id.button1, pendingIntent);

            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
       	public void onReceive(Context context, Intent clickIntent) {
            super.onReceive(context, clickIntent);
            if (clickIntent.getAction().equals(BUTTON_CLICK)) {
                Toast.makeText(context, "Button Clicked", Toast.LENGTH_SHORT).show();
                System.out.println("Click!");
                }

        }


Vielen Dank schon mal!

Gruß
Felix
 
Hallo,

Weiß keiner weiter?
Würde mir auch helfen, wenn jemand ein fertiges einfaches Widget hat, welches einen Toast ausgibt.

Danke!

mfg
felix
 
Dein clickIntent nutzt du gar nicht, wenn ich den Code richtig sehe. Du benutzt für dein PendingIntent das "normale" intent. Woher soll dann das click-Intent kommen?
 
Ich möchte mit meinem Widget später den Datennetzmodus Ein/Aus machen.
Davon bin ich aktuell aber noch weit entfernt, deswegen hätte es mir vorerst gereicht mal ein einfaches Widget zu machen und dann später die Funktion noch zu implementieren.

Für das 3G-Widget sieht der Code so aus:

MyWidgetProvider.java

Code:
package com.ff.apnwidget;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

public class MyWidgetProvider extends AppWidgetProvider {
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {

		RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
				R.layout.widget_layout);

		remoteViews.setOnClickPendingIntent(R.id.sync_button,
				buildButtonPendingIntent(context));

		remoteViews.setTextViewText(R.id.title, getTitle());
		remoteViews.setTextViewText(R.id.desc, getDesc());

		pushWidgetUpdate(context, remoteViews);
	}

	public static PendingIntent buildButtonPendingIntent(Context context) {
		++MyWidgetIntentReceiver.clickCount;

		Intent intent = new Intent();
		intent.setAction(WidgetUtils.WIDGET_UPDATE_ACTION);
		return PendingIntent.getBroadcast(context, 0, intent,
				PendingIntent.FLAG_UPDATE_CURRENT);
	}

	private static CharSequence getDesc() {
		return "Sync to see some of our funniest joke collections";
	}

	private static CharSequence getTitle() {
		return "Funny Jokes";
	}

	public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) {
		ComponentName myWidget = new ComponentName(context,
				MyWidgetProvider.class);
		AppWidgetManager manager = AppWidgetManager.getInstance(context);
		manager.updateAppWidget(myWidget, remoteViews);
	}
}

WidgetUtils.java

Code:
package com.ff.apnwidget;

public class WidgetUtils {
	final static String WIDGET_UPDATE_ACTION ="com.javatechig.intent.action.UPDATE_WIDGET";
}

MyWidgetIntentReceiver.java

Code:
package com.ff.apnwidget;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

public class MyWidgetIntentReceiver extends BroadcastReceiver {
	public static int clickCount = 0;
	private String msg[] = null;

	@Override
	public void onReceive(Context context, Intent intent) {
		if (intent.getAction().equals(WidgetUtils.WIDGET_UPDATE_ACTION)) {
			updateWidgetPictureAndButtonListener(context);
		}
	}

	private void updateWidgetPictureAndButtonListener(Context context) {
		RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
				R.layout.widget_layout);

		// updating view
		remoteViews.setTextViewText(R.id.title, getTitle());
		remoteViews.setTextViewText(R.id.desc, getDesc(context));

		// re-registering for click listener
		remoteViews.setOnClickPendingIntent(R.id.sync_button,
				MyWidgetProvider.buildButtonPendingIntent(context));

		MyWidgetProvider.pushWidgetUpdate(context.getApplicationContext(),
				remoteViews);
	}

	private String getDesc(Context context) {
		// some static jokes from xml
		msg = context.getResources().getStringArray(R.array.news_headlines);
		if (clickCount >= msg.length) {
			clickCount = 0;
		}
		return msg[clickCount];

vielen Dank schon mal! :)
 
Zurück
Oben Unten