Android: PreferenceActivity: Pourquoi cette logique « simple » contrôle sur une valeur de préférence stockée n'évalue?

StackOverflow https://stackoverflow.com/questions/3596478

Question

Après un exemple de Professional Android 2 Application Development I mis en place une classe pref comme suit:

//Preferences.java
public class Preferences extends PreferenceActivity{
    public static final String PREF_SPEED_UNIT ="PREF_SPEED_UNIT";
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.userpreferences);
    }  
}

Dans ma classe d'activité:

// main.java 

private static final int SHOW_PREFERENCES = 1;

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == SHOW_PREFERENCES)
        updateFromPreferences();
        if (resultCode == Activity.RESULT_OK) {
        }   
}

private void updateFromPreferences() {
    Log.d(TAG, "updateFromPreferences()");
    Context context = getApplicationContext();
    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(context);
    // Set the SpeedMode string using object reference to custom view
    mSpeedMode = prefs.getString(Preferences.PREF_SPEED_UNIT, "MPH");
    speedview.SpeedMode = mSpeedMode;  
}
// Using have a Button view that pops the options for testing
private OnClickListener optionbuttonCL = new OnClickListener() {
    public void onClick(View v) {
        Context context = getApplicationContext();
        Intent i = new Intent(context, Preferences.class);
        startActivityForResult(i, SHOW_PREFERENCES);
    }
};

La question est ici:

    // SpeedView.java
    if (SpeedMode == "MPH"){
        // set speed in miles/hour
    }
    if (SpeedMode == "KPH"){
        //set speed in kilometers/hour
    }

Il fonctionne, si je passe les modes de vitesse à KPH (valeur par défaut est MPH), l'affichage ne sont plus mises à jour.

La chose est déconcertante, même si SpeedMode se révèle être « MPH » ou « KPH » en utilisant le débogueur Eclipse, l'instruction if ne seront pas exécutés.

Voici le reste du code:

//userpreferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference android:key="PREF_SPEED_UNIT"
    android:title="Speed Unit" 
    android:summary="Choose between MPH or KPH"
    android:entries="@array/speed_options" 
    android:entryValues="@array/speed_values"
    android:dialogTitle="Speed Unitz" 
    android:defaultValue="MPH" />
</PreferenceScreen>


// arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="speed_options">
    <item>MPH</item>
    <item>KPH</item>
</string-array>
<string-array name="speed_values">
    <item>MPH</item>
    <item>KPH</item>
</string-array>

Merci

Était-ce utile?

La solution

Qu'est-ce que speedview.SpeedMode? Où est-il déclaré. Je parie que votre problème est

SpeedMode == "MPH"

Modifier à

Speedmode.equals("MPH");

En outre, par convention en Java et les langues qui utilisent camelCase, les variables doivent être en minuscules.

Par variables étant minuscules, je veux dire la première lettre de la variable. Donc, si vous aviez un MyClass de classe. Vous déclarer

MyClass myClass;

De cette façon, vous savez que vous n'êtes pas essayer de méthodes de classe d'accès au lieu de méthodes d'instance.

Ceci est une bonne explication sur la raison pour laquelle vous devez utiliser equals () au lieu de ==

http://leepoint.net/notes-java/data/expressions /22compareobjects.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top