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
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
http://www.cs.dartmouth.edu/~campbell/cs65/lecture12/lecture12.html
Inspiré par le post de Gabor
Votre commentaire