Android: PreferenceActivity. Почему эта «простая» логическая проверка сохраненного значения предпочтения не выполняется? - PullRequest
0 голосов
/ 30 августа 2010

Следуя примеру из Профессиональной разработки приложений для Android 2, я настроил класс pref следующим образом:

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

В моем классе активности:

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

Проблема здесь:

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

Это работает, однако, если я переключаю режимы скорости в KPH (по умолчанию MPH), дисплей больше не обновляется.

Недоумение, даже если SpeedMode отображается как «MPH»"или" KPH "с использованием отладчика Eclipse, операторы if не будут выполняться.

Вот остаток кода:

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

Спасибо

1 Ответ

4 голосов
/ 30 августа 2010

Что такое speedview.SpeedMode? Где это заявлено. Держу пари, твоя проблема

SpeedMode == "MPH"

Измените его на

Speedmode.equals("MPH");

Кроме того, по соглашению в Java и языках, которые используют camelCase, переменные должны быть в нижнем регистре.

Под переменными в нижнем регистре я подразумеваю первую букву переменной. Так что, если у вас был класс MyClass. Вы бы объявили это

MyClass myClass;

Таким образом, вы знаете, что не пытаетесь получить доступ к методам класса вместо методов экземпляра.

Это хорошее объяснение того, почему вам нужно использовать .equals () вместо ==

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

...