Question

In Android 4, I have a preference value that I want to appear in the standard form E2C56DB5-DFFB-48D2-B060-D0F5A71096E0. But the user may enter the value without dashes. I would like to allow the user to enter it with any combination of whitespace or dashes, and simply have my code normalize it.

I am using the code below, and I see the log line, but it does nothing. I am guessing this is because Android has another Editor object open that overwrites my changes. Is there any other way to accomplish this?

public class UuidFragment extends PreferenceFragment {
   ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        this.getPreferenceScreen().findPreference("pref_uuid").setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference,
                Object newValue) {
                if (newValue.toString().length() != 0) {
                    String normalizedUuid=normalizeUuid(newValue.toString());
                    // TODO: this code runs but does nothing, I think because after committing the change, there is a higher level editor that commits the old value
                    // thereby undoing this change 
                    if (!normalizedUuid.equals(newValue.toString())) {
                        Log.d(TAG, "Adjusting uuid from "+newValue.toString()+" to "+normalizedUuid);
                        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(UuidFragment.this.getActivity());
                        SharedPreferences.Editor editor = settings.edit();
                        editor.putString(preference.getKey(), normalizedUuid);
                        editor.commit();
                    }
                    return true;
                }
            }
      });
}

}

Was it helpful?

Solution

Try subclassing EditTextPreference and overriding setText(). In your setText() method, fix up the passed-in string before chaining to the superclass. Then, reference your EditTextPreference subclass from your preference XML.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top