2010-06-25 4 views
2

Le PreferenceActivity semble être une classe d'aide très facile à gérer les préférences d'une application.Utilisation de PreferencesL'activité d'un widget?

Je voudrais également utiliser cette même classe à partir du widget.

Lors de la première instance d'un widget, je souhaite que PreferenceActivity apparaisse. C'était très facile à faire à partir de l'activité de configuration mais voici le pépin ...

Je ne sais pas quand l'édition des préférences est terminée! Tous les exemples de préférences de widgets que je vois sur le net utilisent un écran de préférences construit manuellement plutôt que la classe d'aide PreferenceActivity, puis écoutent le bouton «enregistrer» sur lequel on clique.

Comment puis-je faire cela avec le PreferenceActivity puisque cette activité n'a pas de bouton de sauvegarde. Vous utilisez simplement le bouton 'retour' pour valider vos changements de préférences.

Merci!

+0

Cela peut également vous aider: http://stackoverflow.com/questions/2697233/how-to-add-a-button-to-preferencescreen –

Répondre

4

J'ai essayé de faire la même chose et je pense que je l'ai craqué. Je gère l'événement onBackPressed() dans PreferenceActivity et j'effectue une mise à jour de widget à partir de là en utilisant sendBroadcast().

En PreferenceActivity:

@Override 
public void onBackPressed() { 
    Intent intent=getIntent(); 
    Bundle extras=intent.getExtras(); 
    int widgetId=extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

    // this is the intent broadcast/returned to the widget 
    Intent updateIntent = new Intent(this, WidgetProvider.class); 
    updateIntent.setAction("PreferencesUpdated"); 
    updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
    sendBroadcast(updateIntent); 
} 

Dans votre WidgetProvider:

@Override 
public void onReceive(Context context, Intent intent) { 
    if ("PreferencesUpdated".equals(action)) { 
     // update your widget here 
     // my widget supports multiple instances so I needed to uniquely identify them like this 
     RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget); 
     int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); 
     updateWidgetView(context, remoteView, appWidgetId); 
    } 
} 

NOTE: Dans la version 1.5 est onBackPressed support pas le commentaire @Override pour onBackPressed et ajoutez ce code

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    Log.d(LOG_TAG, "onKeyDown() "+ keyCode); 
    if (keyCode==KeyEvent.KEYCODE_BACK && Integer.parseInt(Build.VERSION.SDK)<5) { 
     onBackPressed(); 
    } 
} 

Je devrais ajouter que je suis nouveau sur le développement d'Android, donc je peux le faire entièrement faux. Tout ce que je peux dire, c'est que ça marche pour moi :)

Dites-moi comment vous allez.

+1

Cela n'aide pas ... où est-ce que updateWidgetView() est défini? Et comment cela s'appliquerait-il à la mise à jour de tous les widgets? – swinefeaster

+0

@swinefeaster utilise simplement this.onMise à jour dans le fournisseur –

0

Vous devriez pouvoir indiquer quand les modifications de préférence sont terminées en implémentant un SharedPreferences.OnShredPreferenceChangeListener. En utilisant ceci, vous pouvez mettre à jour seulement quand certaines clefs sont changées, ou inconditionnellement quand n'importe quelles sont changées. N'oubliez pas de l'enregistrer dans votre PreferenceActivity onCreate et de l'annuler l'enregistrement dans onDestroy.

Dans ce cas, vous pouvez faire quelque chose de similaire à Android: How do I force the update of all widgets of a particular kind dans le programme d'écoute pour provoquer la mise à jour de tous vos widgets en fonction d'une modification SharedPreference.

C'est une vieille question, donc cela peut ne plus être pertinent.