web-dev-qa-db-fra.com

Comment faire en sorte que les préférences fonctionnent sur Android?

J'ai vraiment lutté à travers cela. Nouveau sur Java/Android. J'écris ma première application et c'est la première chose qui m'a pris plus de deux jours de recherche pour comprendre. Voici la configuration: c'est une calculatrice/compteur de boissons BAC:

alt text

Une formule est utilisée pour calculer le taux d'alcoolémie. Voici le forumla:

Bac = ((StandardDrinks / 2) * (GenderConstant / Weight)) - (0.017 * Hours);

Comme vous pouvez le constater, le fait de pouvoir modifier le sexe et le poids produira des résultats plus précis et personnalisés. Donc je les ai en double:

double GenderConstant = 7.5; //9 for female
double Weight = 180;

Pour modifier ces variables, j'aimerais que la personne puisse accéder aux paramètres et choisir des valeurs différentes. J'ai ces choses mises en place, mais pas liées aux variables montrées ci-dessus parce que je ne peux pas pour la vie de comprendre comment. Les voici:

alt text

J'appuie sur le bouton de menu et cela apparaît. Génial. Je clique sur Paramètres.

alt text

Maintenant, les préférences apparaissent. Voici mon preferences.xml:

<?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">

 <PreferenceCategory Android:title="Personal Settings">


 <ListPreference
 Android:title="Gender"
 Android:summary="Verify or deny the presence of a Y chromosome."
 Android:key="genderPref"
 Android:defaultValue="male"
 Android:entries="@array/genderArray"
 Android:entryValues="@array/genderValues" />

 <ListPreference
 Android:title="Weight"
 Android:summary="How much the planet pulls on you, in pounds."
 Android:key="weightPref"
 Android:defaultValue="180"
 Android:entries="@array/weightArray"
 Android:entryValues="@array/weightValues" />

 </PreferenceCategory>

<PreferenceCategory Android:title="Drink Settings">

 <ListPreference
 Android:title="Beer Size"
 Android:summary="The volume of your beer, in ounces."
 Android:key="beerPref"
 Android:defaultValue="12"
 Android:entries="@array/beerArray"
 Android:entryValues="@array/beerValues" />

 <ListPreference
 Android:title="Shot Size"
 Android:summary="The volume of your shot, in ounces."
 Android:key="shotPref"
 Android:defaultValue="1.5"
 Android:entries="@array/shotArray"
 Android:entryValues="@array/shotValues" />

 <ListPreference
 Android:title="Wine Size"
 Android:summary="The volume of your wine, in ounces."
 Android:key="winePref"
 Android:defaultValue="5"
 Android:entries="@array/wineArray"
 Android:entryValues="@array/wineValues" />


 </PreferenceCategory>
 </PreferenceScreen>

En avant du poids ListPreference:

alt text

Et ça se voit. Les valeurs sont stockées sous forme de tableaux de chaînes dans res/values ​​/ arrays.xml. Voici un échantillon, juste de ceux de poids:

<string-array name="weightArray">
<item>120 lbs</item>
<item>150 lbs</item>
<item>180 lbs</item>
<item>210 lbs</item>
<item>240 lbs</item>
<item>270 lbs</item>
 </string-array>
 <string-array name="weightValues">
<item>120</item>
<item>150</item>
<item>180</item>
<item>210</item>
<item>240</item>
<item>270</item>
 </string-array>

Ceci est fondamentalement aussi loin que je l'ai eu. Je peux cliquer sur une valeur, bien sûr, mais cela ne change pas la formule car elle n'est pas liée aux doublons que j'ai créés dans DrinkingBuddy.Java. Tous les éléments affichés dans les paramètres ne sont que des coquilles vides pour le moment, y compris le bouton fléché de la présentation principale (la durée par défaut est définie à 1 heure).

J'ai créé un Preferences.Java et j'ai essayé d'implémenter diverses combinaisons de code trouvées dans des tutoriels et des ressources sur le Web, mais en vain. Quoi qu’il en soit, il est rempli de tentatives infructueuses pour faire de BeerPref (l’option de paramètres permettant de modifier le nombre d’onces dans la bière) une corrélation avec une variable de ma classe principale:

package com.dantoth.drinkingbuddy;


 import Android.app.Activity;
 import Android.content.SharedPreferences;
 import Android.os.Bundle;
 import Android.preference.Preference;
 import Android.preference.PreferenceActivity;
 import Android.preference.Preference.OnPreferenceClickListener;


 public class Preferences extends PreferenceActivity {

public static final String PREF_BEER_SIZE = "PREF_BEER_SIZE";

@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 addPreferencesFromResource(R.xml.preferences);

 //Get the custom preference



 Preference beerPref = (Preference) findPreference("beerPref");
 beerPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {

 public boolean onPreferenceClick(Preference preference) {

 SharedPreferences customSharedPreference = getSharedPreferences("myCustomSharedPrefs", Activity.MODE_PRIVATE);
 SharedPreferences.Editor editor = customSharedPreference.edit();

 editor.commit();
 return true;
 }}

 );}
 }

Un tutoriel complet et un exemple de code seraient IMPRESSIONNANTS car je n'ai pas encore trouvé de guides fiables.

24
Dan T

Je travaille toujours tout cela moi-même, mais (quelque peu adapté de ma version), je pense que votre classe de préférences doit uniquement effectuer les opérations suivantes:

public class Preferences extends PreferenceActivity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // load the XML preferences file
        addPreferencesFromResource(R.xml.preferences);
    }
}

Ensuite, dans votre classe principale, vous pouvez vous référer aux préférences:

public class DrinkingBuddy extends Activity 
                           implements OnSharedPreferenceChangeListener {

    private int weight;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

        // register preference change listener
        prefs.registerOnSharedPreferenceChangeListener(this);

        // and set remembered preferences
        weight = Integer.parseInt((prefs.getString("weightPref", "120")));
        // etc
    }

    // handle updates to preferences
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        if (key.equals("weightValues")) {
            weight = Integer.parseInt((prefs.getString("weightPref", "120")));
        }
        // etc
    }
}

L'enregistrement des mises à jour des préférences est géré pour vous.

(Pas trop sûr des déclarations publiques/privées!)

17
ChrisV

Vous demandez probablement deux ensembles différents de fichiers de préférences.

Assurez-vous de stocker les valeurs ListPreference dans les mêmes fichiers. Démarrez adb dans le cd /data/data/com.your.package et recherchez des dossiers et des fichiers de préférences de type.

Je pense que le problème est que vous spécifiez un fichier différent de celui où le paramètre a été enregistré:

Essayez de changer ceci:

SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

à

SharedPreferences preferences = PreferenceManager
                .getDefaultSharedPreferences(context);

Ensuite, vous devrez probablement interroger uniquement

preferences.getString('weightPref', null);

Aussi vous n'avez pas besoin de l'éditeur . Les préférences sont enregistrées automatiquement.

4
Pentium10

Pour la plupart des applications, il est plus pratique d’utiliser les préférences partagées par défaut. Vous pouvez obtenir de n'importe où dans le thème de votre application avec:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

Vous pouvez y enregistrer de nouvelles variables avec:

sp.edit().putString("var_name", "var value".apply();
0
oabarca