IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Utilisation dynamique des SharedPreferences pour configurer un AppWidget


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 19
    Par défaut Utilisation dynamique des SharedPreferences pour configurer un AppWidget
    Bonjour à toutes et à tous. J'ai réussi à développer mon premier widget, il affiche bien la date et l'heure en temps réel. Pour Améliorer ce dernier j'aimerais que l'utilisateur puisse le personnaliser. Ainsi, pour ce faire j'ai pensé aux SharedPreferences. Pour m'initier à l'utilisation de ce concept j'ai pensé faire un mémo qui afficherait sur le bureau (grâce à un textview) le contenu d'un EditTextPreference. Mon problème est le suivant Chaque instance de mon widget va lire le même fichier de preference. Comment créer de manière dynamique un fichier de preference dont le nom serait preference+WidgetId. Je vous remercie par avance de bien vouloir m'aider à y voir plus clair. Voici mon code :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    package loris.widget2.memo;
     
     
     
     
     
     
    import android.app.Activity;
    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.preference.PreferenceManager;
    import android.widget.RemoteViews;
    import android.widget.Toast;
    import android.content.SharedPreferences;
     
     
    public class memoActivity extends AppWidgetProvider {
     
    	private static final String INTENT_CLICK = "loris.widget2.memo.click1";
    	private static final Integer ALL_WIDGETS = -1;
     
     
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		super.onReceive(context, intent);
     
    		if (INTENT_CLICK.equals(intent.getAction())) {
    		int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,ALL_WIDGETS);	
    		buildView(context,appWidgetId);  
    		}
     
     
    		}
     
    	@Override
    	public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    		super.onUpdate(context, appWidgetManager, appWidgetIds);
    		buildView(context,ALL_WIDGETS);
    	}
     
     
     
    	/************************************************/
    	private void buildView(Context context,int widgetId){
     
    		SharedPreferences preferences;
     
    		AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    		ComponentName componentName = new ComponentName(context, memoActivity.class);
    		int[] appWidgetIds = appWidgetManager.getAppWidgetIds(componentName);
    		final int N = appWidgetIds.length;
    		RemoteViews views; 
    		int appWidgetId;
    		for (int i = 0; i < N; i++) {
    		appWidgetId = appWidgetIds[i];
    		if ((widgetId == ALL_WIDGETS) || (widgetId == appWidgetId)) {
     
    			views = new RemoteViews(context.getPackageName(), R.layout.main);
    			//preferences = context.getSharedPreferences("preference", Activity.MODE_PRIVATE);
    			preferences = PreferenceManager.getDefaultSharedPreferences(context);
     
    		views.setTextViewText(R.id.hello_world_widget, preferences.getString("EditTextKey", "mmmmmmm"));
     
    	        Intent intent2 = new Intent(context, memoActivity2.class);
    	        intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    	        int appWidgetId25 = intent2.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
    	        //Toast.makeText(context,"Test 1298 : "+ String.valueOf(widgetId), Toast.LENGTH_LONG).show();
    	        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,	intent2, 0);
     
    			views.setOnClickPendingIntent(R.id.hello_world_widget, pendingIntent);
     
    			appWidgetManager.updateAppWidget(appWidgetId, views);
    		}
     
    		}
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    package loris.widget2.memo;
     
     
     
     
    import android.app.Activity;
    import android.appwidget.AppWidgetManager;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
    import android.os.Bundle;
    import android.preference.PreferenceActivity;
    import android.preference.PreferenceManager;
    import android.widget.RemoteViews;
    import android.widget.TextView;
    import android.widget.Toast;
     
     
    public class memoActivity2 extends PreferenceActivity implements OnSharedPreferenceChangeListener {
    	TextView hello_world_widget = null;
    	SharedPreferences pref;
    	  @Override
    	    public void onCreate(Bundle savedInstanceState) {
    	        super.onCreate(savedInstanceState);
    	        //setContentView(R.layout.main2);
    	        addPreferencesFromResource(R.xml.preference);
     
    	       pref = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
                pref.registerOnSharedPreferenceChangeListener(this);
     
                AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getBaseContext());
     
                Intent launchIntent = getIntent();
    	        Bundle extras = launchIntent.getExtras();
    			int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
              //  Toast.makeText(getBaseContext(),"Test 19 : "+ String.valueOf(getBaseContext().), Toast.LENGTH_LONG).show();
    	  }
     
    	  @Override
    	  public void onSharedPreferenceChanged(SharedPreferences preference, String key){
     
     
    		  AppWidgetManager appWidgetManager2 = AppWidgetManager.getInstance(getBaseContext());
    		  ComponentName componentName = new ComponentName(getBaseContext(), memoActivity.class);
    		  int[] appWidgetIds = appWidgetManager2.getAppWidgetIds(componentName);
    		  final int N = appWidgetIds.length;
    		  int appWidgetId;
    			for (int i = 0; i < N; i++) {
    			appWidgetId = appWidgetIds[i];
    			//Toast.makeText(getBaseContext(),"Test 147 : "+ String.valueOf(appWidgetId), Toast.LENGTH_LONG).show();
    			 RemoteViews views; 
    			 views = new RemoteViews(getBaseContext().getPackageName(), R.layout.main);
    			 views.setTextViewText(R.id.hello_world_widget, preference.getString(key, "") );
     
    			appWidgetManager2.updateAppWidget(appWidgetId, views);
     
    			}
     
    	  }

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Ben on ne peut pas....

    L'idée c'est de changer le nom des propriétés en fonction du widgetID.
    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
     
    class MyWidgetSettings
    {
          private int value1;
          private String value2;
          private Uri value3;
     
          public MyWidgetSettings()
          {
                // load defaults
          }
     
          private static String getWidgetSuffix(int widgetId)
          { return "_" + integer.toString(widgetId); }
     
          public void load(int widgetId, Context ctxt) {
              String suffix = getWidgetSuffix(widgetId);
     
              SharedPreferences prefs = ....;
              this.value1 = prefs.getInt("value1"+suffix);
              this.value2 = prefs.getString("value2"+suffix);
              this.value3 = prefs.getParcelable("value3"+suffix);
         }
     
         public boolean save(int widgetId, Context ctxt) {
              String suffix = getWidgetSuffix(widgetId);
     
               Editor ed = ...;
               ed.putInt("value1"+suffix,this.value1);
               ed.putString("value2"+suffix,this.value2);
               ed.putParcelable("value3"+suffix,this.value3);
               return ed.commit();
         }
    }
    Autre solution (ma préférée maintenant): rendre les settings "parcelable", et direct sauvegarder les settings en tant que "widget_#_settings" par exemple.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 19
    Par défaut
    Merci pour la réponse. Une autre question pourquoi n'ai je pas le même appWidgetId entre ces deux activités ? J'aimerais dans que dans memoActivity2 je récupère l'id du widget qui l'a déclenché. Merci de m'aider à y voir plus claire.

    AppWidgetProvider : AppWidgetId 107
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    package loris.widget2.memo;
     
     
     
     
     
     
    import android.app.Activity;
    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.preference.PreferenceManager;
    import android.widget.RemoteViews;
    import android.widget.Toast;
    import android.content.SharedPreferences;
     
     
    public class memoActivity extends AppWidgetProvider {
     
    	private static final String INTENT_CLICK = "loris.widget2.memo.click1";
    	private static final Integer ALL_WIDGETS = -1;
     
     
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		super.onReceive(context, intent);
     
    		if (INTENT_CLICK.equals(intent.getAction())) {
    		int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,ALL_WIDGETS);	
    		buildView(context,appWidgetId);  
    		}
     
     
    		}
     
    	@Override
    	public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    		super.onUpdate(context, appWidgetManager, appWidgetIds);
    		buildView(context,ALL_WIDGETS);
    	}
     
     
     
    	/************************************************/
    	private void buildView(Context context,int widgetId){
     
     
     
    		AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    		ComponentName componentName = new ComponentName(context, memoActivity.class);
    		int[] appWidgetIds = appWidgetManager.getAppWidgetIds(componentName);
    		final int N = appWidgetIds.length;
    		RemoteViews views; 
    		int appWidgetId;
    		for (int i = 0; i < N; i++) {
    		appWidgetId = appWidgetIds[i];
    		if ((widgetId == ALL_WIDGETS) || (widgetId == appWidgetId)) {
     
    			views = new RemoteViews(context.getPackageName(), R.layout.main);
     
     
    		views.setTextViewText(R.id.hello_world_widget, "appWidgetId || " + String.valueOf(appWidgetId)); // affiche 107
     
    	        Intent intent2 = new Intent(context, memoActivity2.class);
    	        intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);// 
     
    	        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,	intent2, 0);// ce pending intent doit normalement transmettre l'appWidgetId 107 à l'activity memoActivity2.class
    			views.setOnClickPendingIntent(R.id.hello_world_widget, pendingIntent);
     
    			appWidgetManager.updateAppWidget(appWidgetId, views);
    		}
     
    		}
     
    	}
    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
    package loris.widget2.memo;
    
    
    
    
    
    import android.app.Activity;
    import android.appwidget.AppWidgetManager;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
    import android.os.Bundle;
    import android.preference.PreferenceActivity;
    import android.preference.PreferenceManager;
    import android.widget.RemoteViews;
    import android.widget.TextView;
    import android.widget.Toast;
    
    
    public class memoActivity2 extends Activity {
    	TextView hello_world_widget = null;
    	
    	  @Override
    	    public void onCreate(Bundle savedInstanceState) {
    	        super.onCreate(savedInstanceState);
    	        setContentView(R.layout.main2);
    	        hello_world_widget=(TextView)findViewById(R.id.hello_world_widget);
    	        
    	        Intent launchIntent = getIntent(); // ce launch intent doit normalement récupérer le contenu du intent2 du appWidgetProvider et contenir 107 
    	        Bundle extras = launchIntent.getExtras();
    			int appWidgetId25 = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
               Toast.makeText(getBaseContext(),"Test 1878 : "+ String.valueOf(appWidgetId25), Toast.LENGTH_LONG).show(); // afiche 99 au lieu de 107 Pourquoi ?
    	  }

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Haha le piège des PendingIntent !!!

    Un pending intent est identifié de manière unique par:
    * Son 'action'
    * Son identifiant (le deuixeme parametre)

    Donc tous les pending intent que tu crée sont identiques (et au final, un seul pending intent partagé)... Le "Extra" sera donc probablement le dernier widget raffraichi

    La solution simple est de passer le widgetId dans le deuxième paramètre du PendingIntent....

  5. #5
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 19
    Par défaut
    Merci pour la réponse. Pourriez vous me donner un exemple de ce que vous me dites de façon à ce que je puisse y voir plus claire. Je vous en remercie par avance. En fait j'aimerais avoir plusieurs intances d'un Widget et transmettre l'appwidget id de l'instance qui a déclenché un intent.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Il suffit juste de modifier la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,	intent2, 0);
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PendingIntent pendingIntent = PendingIntent.getActivity(context, widgetId,	intent2, 0);
    Le dernier 0 est pour les flags....

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/02/2010, 23h06
  2. Réponses: 2
    Dernier message: 19/03/2009, 15h53
  3. Utilisation dynamique des composants
    Par Gaadek dans le forum Delphi
    Réponses: 2
    Dernier message: 10/01/2007, 11h09
  4. utilisation dynamique des DLL
    Par ielbenna dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 25/09/2006, 11h48
  5. [JSP] utilisation dynamique des includes
    Par shinchun dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/05/2004, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo