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

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

Photo Facebook

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

Connexion à %s

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
%d blogueurs aiment cette page :