Ecran de gestion des préférences

Afin de gérer un écran de configuration qui sera appelé via un menu dans un écran de l’application il est nécessaire de créer un fichier XML (ici prefs.xml) à placer dans l’arborescence res\xml

 <?xml version="1.0" encoding="utf-8"?>  
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"  
     android:title="Settings">  
     <EditTextPreference android:title="Name"  
         android:inputType="text"  
         android:key="name"   
         android:persistent="true"   
         android:defaultValue="" />  
     <EditTextPreference android:title="Password"  
         android:inputType="textPassword"  
         android:key="password"   
         android:persistent="true"   
         android:defaultValue="" />  
     <CheckBoxPreference android:title="Auto login"  
      android:key="autostart"   
      android:persistent="true"   
      android:defaultValue="true" />  
 </PreferenceScreen>  

Cet écran sera activé via une classe qui gérera aussi la mise à jour du champ summary (la deuxième ligne des options) :

 package com.andrologiciels.andropreferencechange;  
 import android.content.SharedPreferences;  
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;  
 import android.os.Bundle;  
 import android.preference.CheckBoxPreference;  
 import android.preference.EditTextPreference;  
 import android.preference.Preference;  
 import android.preference.PreferenceActivity;  
 import android.preference.PreferenceManager;  
 public class PreferenceSettingActivity extends PreferenceActivity implements  
 OnSharedPreferenceChangeListener {  
 @SuppressWarnings("deprecation")  
 @Override  
  protected void onCreate(Bundle savedInstanceState) {  
   super.onCreate(savedInstanceState);  
   PreferenceManager.setDefaultValues(this, R.xml.prefs, false);  
   addPreferencesFromResource(R.xml.prefs);  
   SharedPreferences sp = getPreferenceScreen().getSharedPreferences();  
   Preference name = (Preference) findPreference("name");  
   name.setSummary(sp.getString("name", ""));  
   Preference password = (Preference) findPreference("password");  
   password.setSummary(sp.getString("password", "").replaceAll(".","*"));  
   CheckBoxPreference autostart = (CheckBoxPreference) findPreference("autostart");  
   if(autostart.isChecked())  
    autostart.setSummary("Auto Login On");  
   else  
    autostart.setSummary("Auto Login Off");  
  }  
  @SuppressWarnings("deprecation")  
 @Override  
  protected void onPause() {  
   getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);  
   finish();  
   super.onPause();  
  }  
  @SuppressWarnings("deprecation")  
 protected void onResume() {  
   super.onResume();  
   getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);  
  }  
  //-- Manage the change event  
  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {  
   @SuppressWarnings("deprecation")  
      Preference pref = findPreference(key);  
   //-- Manage EditTextField  
   if (pref instanceof EditTextPreference) {  
    EditTextPreference etp = (EditTextPreference) pref;  
    if(pref.getKey().equals("password")){  
     pref.setSummary(etp.getText().replaceAll(".","*"));  
    }else{  
      pref.setSummary(etp.getText());  
    }  
   }  
   else   
        if(pref instanceof CheckBoxPreference){  
          if(((CheckBoxPreference)pref).isChecked())  
               {if(pref.getKey().equals("autostart"))  
                 pref.setSummary("Auto Login On");}  
          else  
               {if(pref.getKey().equals("autostart"))  
             pref.setSummary("Auto Login Off");}  
          }  
  }  
 }  

Ne pas oublier de modifier le fichier manifest en ajoutant avant la fin du fichier (avant la balise </application>)

     <activity  
        android:name=".PreferenceSettingActivity">  
     </activity>  

Dans l’application, appel dans le menu de la class de gestion des préférences :

 package com.andrologiciels.andropreferencechange;  
 import android.annotation.SuppressLint;  
 import android.annotation.TargetApi;  
 import android.app.ActionBar;  
 import android.app.Activity;  
 import android.os.Build;  
 import android.os.Bundle;  
 import android.preference.PreferenceManager;  
 import android.view.Menu;  
 import android.view.MenuInflater;  
 import android.view.MenuItem;  
 import android.widget.TextView;  
 import android.content.Intent;  
 import android.content.SharedPreferences;  
 public class PreferenceChangeActivity extends Activity {  
   //-- Global Var  
      private     TextView printname;  
      private String TxtName="";  
      @Override  
      public void onCreate(Bundle savedInstanceState) {  
           super.onCreate(savedInstanceState);  
           //-- Main Screen  
           setContentView(R.layout.main);  
           printname = (TextView) findViewById(R.id.printname);  
        //-- Get preferences  
           loadPref();  
      }  
      //-- Menu Init  
      @TargetApi(Build.VERSION_CODES.HONEYCOMB)  
      @SuppressLint("NewApi")  
      public boolean onCreateOptionsMenu(Menu menu) {   
             MenuInflater inflater = getMenuInflater();   
             inflater.inflate(R.menu.menu, menu);  
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {  
                      ActionBar actionBar = getActionBar();  
                      actionBar.setDisplayHomeAsUpEnabled(true);  
                 }  
                 return true;  
            }  
      @Override  
      public boolean onOptionsItemSelected(MenuItem item) {  
           switch (item.getItemId()) {   
          case android.R.id.home: //--Home  
            finish();  
             return true;  
                case R.id.settings:  
                {  
                         Intent intent = new Intent(this, PreferenceSettingActivity.class);  
               startActivityForResult(intent, 0);   
             return true;  
                }  
                default:  
                {  
                     return false;  
                }  
           }  
      }  
   /////////////  
      private void loadPref(){  
            SharedPreferences mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);  
            TxtName = mySharedPreferences.getString("name", "Empty");  
           //-- Update printname  
           printname.setText(TxtName);  
      }  
      //////////  
      //-- Intent Result (update txt field with pref)  
   @Override     
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        loadPref();  
   }  
 }  

Le code complet de l’exemple est ici

Pour un switch preferences (ON/OFF) :

<SwitchPreference android:key= »test »

 android:switchPadding="14sp"

android:title= »This is test toggle switch » />

Afin d’insérer des catégories (rubriques):

<PreferenceCategory
    android:key="cat_log"
    android:title="@string/lib_catlog">
...
...
</PreferenceCategory>

Paramétrage par défaut des préférences :

android:defaultValue="true"
Et dans le code
PreferenceManager.setDefaultValues(this, R.xml.prefs, false); //-- Charge le défaut 1 seule fois

Préférences et Fragment :

1°) Créer le fichier XML comme ci-dessus

2°) Créer une classe java de gestion des préférences (exemple « GestPref ») :

 public class GestPref extends PreferenceActivity {  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     //-- Mise en place du fragment  
     getFragmentManager().beginTransaction()  
         .replace(android.R.id.content,  
             new MainSettingsFragment()).commit();  
   }  
   //-- Gestion du fragment  
   public static class MainSettingsFragment extends PreferenceFragment  
       implements SharedPreferences.OnSharedPreferenceChangeListener{  
     @Override  
     public void onCreate(Bundle savedInstanceState) {  
       super.onCreate(savedInstanceState);  
       addPreferencesFromResource(R.xml.prefs); //-- Ici le fichier des préférences  
       //-- Gestion de l'initialisation des préférences  
       for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {  
         pickPreferenceObject(getPreferenceScreen().getPreference(i));  
       }  
     }  
     //-- Fonction pour gérer les summary  
     private void pickPreferenceObject(Preference p) {  
       if (p instanceof PreferenceCategory) {  
         PreferenceCategory cat = (PreferenceCategory) p;  
         for (int i = 0; i < cat.getPreferenceCount(); i++) {  
           pickPreferenceObject(cat.getPreference(i));  
         }  
       } else {  
         initSummary(p);  
       }  
     }  
     //-- Initialisation du summary avec le contenu de la préférence  
     private void initSummary(Preference p) {  
       if (p instanceof EditTextPreference) {  
         EditTextPreference editTextPref = (EditTextPreference) p;  
         Log.d("Key=Valeur",p.getKey()+"="+((EditTextPreference) p).getText());  
         p.setSummary(editTextPref.getText());  
       }  
       //-- Placer ici d'autres actions en fonction du type de préférences.  
     }  
     //-- Gestion des actions Pause Resume et Change  
     @Override  
     public void onResume() {  
       super.onResume();  
       getPreferenceScreen().getSharedPreferences()  
           .registerOnSharedPreferenceChangeListener(this);  
     }  
     @Override  
     public void onPause() {  
       super.onPause();  
       getPreferenceScreen().getSharedPreferences()  
           .unregisterOnSharedPreferenceChangeListener(this);  
     }  
     //-- Ici on met à jour le summary avec la valeur saisie  
     @Override  
     public void onSharedPreferenceChanged(SharedPreferences  
                            sharedPreferences, String key) {  
       if (key.equals("nDelai")) {  
         Preference foodPref = findPreference(key);  
         foodPref.setSummary(sharedPreferences.getString(key, ""));  
       }  
       if (key.equals("nNbMax")) {  
         Preference foodPref = findPreference(key);  
         foodPref.setSummary(sharedPreferences.getString(key, ""));  
       }  
     }  
   }  
 }  

3°) Déclarez la classe dans le manifest :

<activity android:name= ».GestPref »> </activity>

4°) Appel des préférences :

Intent intent = new Intent(EcranPrincipal.this, GestPref.class);
 startActivity(intent);

5°) Récupération des valeurs :
private void getPreferences() {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    bVibration = preferences.getBoolean("Vibration", false);}

Références :

http://www.101apps.co.za/index.php/articles/preference-settings.html

http://developer.android.com/reference/android/preference/PreferenceFragment.html

http://codetheory.in/saving-user-settings-with-android-preferences/ http://stackoverflow.com/questions/23523806/how-do-you-create-preference-activity-and-preference-fragment-on-android

https://zestedesavoir.com/tutoriels/609/aller-plus-loin-dans-le-developpement-android-1/323_fragmenter-vos-projets/1849_preferencefragment/

http://www.cs.dartmouth.edu/~campbell/cs65/lecture12/lecture12.html

Inspiré par le post de Gabor

http://developer.android.com/guide/topics/ui/settings.html

 

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Articles récents
Commentaires récents
fatima sur Bienvenue !
AdminDroid sur Bienvenue !
fatima sur Bienvenue !
Archives
Catégories
%d blogueurs aiment cette page :