Bonjour à tous,

Je suis en train de me "former" au développement android et je commence par une petite appwidget (pas d'activité de configuration pour l'instant) pour répondre à un de mes besoins du moment (des boutons qui envoie une requête HTTP sur ma box domotique). J'ai donc suivi pas mal de tuto pour comprendre le fonctionnement (je suis développeur à la base dans plusieurs technos) et la structure d'une appwidget android.
Je pars de la base car je me heurte à un symptôme que je n'arrive pas à comprendre qui m'a obligé à tout reprendre petit à petit : et c'est pas faute d'avoir chercher des réponses sur le net !!!

J'ai créé un widget qui contient concrètement un 'textview' et un 'button'. Et je voudrais commencer par faire un truc tout con : un clic sur le bouton affiche un texte défini dans mon 'textview'.
Je passe par des intent qui demande le rafraîchissement de mon widget et comme à terme, j'aurai plusieurs boutons qui envoient cette même action, je cherche à distinguer qui vient d'appeler et traiter les distinctions de bouton dans le "onreceive" de mon code. Je passe donc, comme je l'ai vu à plusieurs endroits, par les méthodes "putExtra(<code>,<valeur>)" dans le 'onupdate' et les méthodes de récupération "getStringExtra(<code>)" dans le 'onreceive'.

Malheureusement, si j'arrive bien à afficher dans un "toast" le résultat de mon intent.getStringExtra("moncode"), je ne parviens pas à le manipuler ailleurs. Si je mets dans le résultat dans une variable et que je manipule la variable, j'ai un "nullpointerexception" qui se lève sur la variable. Si je teste
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
if(intent.getStringExtra("moncode").equals("toto")) {
...
}
, j'ai un nullpointerexception....

C'est incompréhensible. Si vous savez pourquoi ça me donne ça, je suis preneur.
Je suis sur le SDK pour android 4.4.2. Et j'obtiens les mêmes plantages sur ce soit sur émulateur ou sur device USB.

Pour être plus précis, voici le code tout con :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
public class JeedomControllerWidget extends AppWidgetProvider {
 
    private static String monTexte;
 
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
 
        final int length = appWidgetIds.length;
        for (int i = 0 ; i < length ; i++) {
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_main);
 
            // On met le bon texte dans le bouton
            views.setTextViewText(R.id.vwStatus, "Mon texte à moi : " + monTexte);
 
            Intent previousIntent = new Intent(context, JeedomControllerWidget.class);
 
            previousIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            previousIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
            previousIntent.putExtra("monchoix", "boutonOn");
 
            Uri data = Uri.withAppendedPath(Uri.parse("WIDGET://widget/id/"), String.valueOf(R.id.boutonOn));
            previousIntent.setData(data);
 
            PendingIntent previousPending = PendingIntent.getBroadcast(context, 0, previousIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            views.setOnClickPendingIntent(R.id.boutonOn, previousPending);
 
            appWidgetManager.updateAppWidget(appWidgetIds[i], views);
        }
 
    }
 
    @Override
    public void onReceive(Context context, Intent intent) {
 
        //RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_main);
        // On met le bon texte dans le bouton
        //views.setTextViewText(R.id.vwStatus, "Mon nouveau à moi");
        String receive = intent.getStringExtra("monchoix");
        Toast.makeText(context,receive,Toast.LENGTH_LONG).show();
        //monTexte = (receive.isEmpty())?"ok":"ko";
        if (intent.getStringExtra("monchoix").equals("boutonOn")) {
            monTexte = "J'ai cliqué";
        }
 
        // On revient au traitement naturel du Receiver, qui va lancer onUpdate s'il y a demande de mise à jour
        super.onReceive(context, intent);
    }
}
Merci de votre aide !