2010-08-29 4 views
0

Après un exemple d'Android Professional 2 Développement d'applications I mis en place une classe pref comme suit:Android: PreferenceActivity: Pourquoi cette vérification logique «simple» sur une valeur de préférence enregistrée n'évalue-t-elle pas?

//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 
    } 

Cela fonctionne, cependant si je change de mode de vitesse à KPH (par défaut est MPH), l'affichage ne se met plus à jour. Ce qui est déconcertant est que SpeedMode soit "MPH" ou "KPH" en utilisant le débogueur Eclipse, les instructions if ne s'exécuteront pas.

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

Répondre

4

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

SpeedMode == "MPH" 

Modifier à

Speedmode.equals("MPH"); 

également, 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 une classe MyClass. Vous déclarer

MyClass myClass; 

De cette façon, vous savez que vous n'êtes pas essayer d'accéder à des méthodes de classe au lieu des 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

+0

Oh mon Dieu ... Je savais qu'il fallait être quelque chose sous mon nez ... Leçon apprise! Merci beaucoup. Je vais écouter votre conseil! – Danedo

Questions connexes