Waarschijnlijk zit ik nu keihard te falen ergens (geen idee waarom ik zo slecht ben met dit onderwerp), maar ik zit nu te spelen met widgets (die voor op je homescreen voor duidelijkheid, Android heeft meerdere dingen die Widget heten). Nu lukt het mij eindelijk na flink researchen om bijvoorbeeld de browser te starten als ik op een widget druk (doe ik overigens door een volledig doorzichtige afbeelding over de widget heen te plaatsen, ik heb geen idee of dat een goede gewoonte is), maar wat ik eigenlijk wil doen is een stuk code uitvoeren als ik de widget aanraak, niet een Activity starten. Gewoon simpelweg een methode uitvoeren. Iemand een idee?
Verwijderd
Je oplossing voor het starten van een 'actie' als je een widget aanklikt is creatief maar wat omslachtig, je zou deze actie ook aan een button kunnen koppelen en volgens mij ook wel aan de hele widget.
Maar wat is er zo moeilijk aan een method uitvoeren ten opzichte van het starten van een activity ? je kunt deze method toch via een eventlistener koppelen aan een UI element ?
Maar wat is er zo moeilijk aan een method uitvoeren ten opzichte van het starten van een activity ? je kunt deze method toch via een eventlistener koppelen aan een UI element ?
Widgets zijn wat bijzonder tegenover normale Activities. Naar mijn weten kan je niet een normale onClickListener eraan koppelen en er een onClick erbij gebruiken. Op dit moment heb ik inderdaad een Button geprobeerd, maar ik lijk nog steeds tot nu toe hetzelfde probleem te hebben. Widgets zijn sterk afhankelijk van Intents en RemoteViews (je kan dus niet zomaar tot zover ik weet gewoon een Button in de klasse achter je widget beschrijven, ook de methode findViewById is afwezig bij een AppWidgetProvider), waarmee ik in tegenstelling tot gewone Views totaal niet mee kan omgaan. Daar kan je naar mijn weten niet een OnClickListener klasse aanvasthangen en gewoon de onClick-methode van invullen.
Ik ben erachter gekomen dat AppWidgetProviders BroadcastReceivers zijn. Dit zou relevant zijn, al moet ik nog uitzoeken op precies welke manier. Blijkbaar moet ik de widget een broadcast naar zichzelf laten sturen, wat mogelijk is met de methodes die bij widgets gangbaar zijn, zo begrijp ik het. De meeste info die ik vond ging echter uit van het launchen van een Activity, en samen met het feit dat klik events minder straightforward zijn dan het geval is bij Activities is dit wat lastiger om uit te zoeken.
Ik krijg het echter nog niet voor elkaar het met deze info wel juist te doen.
EDITJE:
Ik maak nu als ik op een widget druk (heb er een knop voor gemaakt) een service aan, die eventjes draait en dan zichzelf stopt. Mocht iemand soortgelijke problemen krijgen dan is er bij deze hier dus een oplossing te vinden.
Dit zit in de AppWidgetProvider (SendService is dus een klasse die een bepaalde service beschrijft waarvan in onStartCommand de code zit die ik wil uitvoeren en daarna stopSelf() wordt aangeroepen):
Niet vergeten alles in de AndroidManifest te declareren. Je app mag geen Service starten of zal geen Widgets bevatten als je ze niet expliciet declareert.
Ik krijg het echter nog niet voor elkaar het met deze info wel juist te doen.
EDITJE:
Ik maak nu als ik op een widget druk (heb er een knop voor gemaakt) een service aan, die eventjes draait en dan zichzelf stopt. Mocht iemand soortgelijke problemen krijgen dan is er bij deze hier dus een oplossing te vinden.
Dit zit in de AppWidgetProvider (SendService is dus een klasse die een bepaalde service beschrijft waarvan in onStartCommand de code zit die ik wil uitvoeren en daarna stopSelf() wordt aangeroepen):
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // Create an intent to launch the service Intent serviceIntent = new Intent(context, SendService.class); //hier doe ik wat data in de intent die vervolgens gebruikt kan worden door de Service serviceIntent.setData(Uri.parse("uri::somethingrandomandunique")); serviceIntent.putExtra("Lamp", "1a"); // PendingIntent is required for the onClickPendingIntent that actually // starts the service from a button click PendingIntent pendingServiceIntent = PendingIntent.getService(context, 0, serviceIntent, Intent.FLAG_ACTIVITY_NEW_TASK); // Get the layout for the App Widget and attach a click listener to the // button RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget1a); views.setOnClickPendingIntent(R.id.button1a, pendingServiceIntent); // super.onUpdate(context, appWidgetManager, appWidgetIds); ComponentName componentName = new ComponentName(context.getPackageName(), Widget1a.class.getName()); appWidgetManager.updateAppWidget(componentName, views); } |
Niet vergeten alles in de AndroidManifest te declareren. Je app mag geen Service starten of zal geen Widgets bevatten als je ze niet expliciet declareert.
[ Voor 69% gewijzigd door Amanoo op 30-04-2013 10:38 ]