Ecran de gestion des préférences

https://google-developer-training.github.io/android-developer-fundamentals-course-practicals/en/Unit%204/92_p_adding_settings_to_an_app.html

Préférences avec AndroidX et Fragments :

https://www.androidhive.info/2017/07/android-implementing-preferences-settings-screen/

Via <New> <Activity><Settings Activity>

Cela va créer les classes et fichier xml nécessaire. Juste modifier le fichier des préférences comme souhaité.

 Lecture des préférences dans le code :

SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
String strUserName = SP.getString("username", "NA");
boolean bAppUpdates = SP.getBoolean("applicationUpdates",false);
String downloadType = SP.getString("downloadType","1");

https://developer.android.com/guide/topics/ui/settings

Tuto sur Medium

Ancienne méthodes :

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

   
   
       
       
       
   

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 )

       
       

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) :

 android:switchPadding="14sp"

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

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

...
...

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 :

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);}

Astuces :

Pour une préférence de type numérique :

android:inputType="phone"

Récupération de valeur booléenne :

Preference SMS_DATIM = (Preference) findPreference("SMS_DATIM");
SMS_DATIM.setSummary(sp.getBoolean("SMS_DATIM", true) ?  getResources().getString(R.string.lib_Affic_SMS_DATTIM):
        getResources().getString(R.string.lib_Affic_SMS_NODATTIM));

Pour ajouter un bouton à un écran de préférences :

https://stackoverflow.com/questions/2697233/how-to-add-a-button-to-preferencescreen/3026922#3026922

Références :

https://www.androidhive.info/2017/07/android-implementing-preferences-settings-screen/

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.

Articles récents
Commentaires récents
fatima dans Bienvenue !
AdminDroid dans Bienvenue !
fatima dans Bienvenue !
Archives
Catégories