2010-03-29 4 views
13

Есть ли у кого-нибудь образец кода для проверки введенного пользователем текста в настройках? Например, у меня есть EditTextPreference для ввода пользователем адреса электронной почты. Я хотел бы подтвердить формат введенного адреса электронной почты и открыть диалоговое окно предупреждения, если формат неверен. У кого-нибудь есть образец кода для этого? БлагодаряКак вы проверяете формат и значения EditTextPreference, введенные в Android 2.1?

ответ

10

Реализовать Preference.OnPreferenceChangeListener

булево onPreferenceChange (предпочтение предпочтений, объект новое_значение)

Вызывается, когда предпочтение было изменено пользователем. Это вызывается до того, как состояние Preference будет обновлено и до того, как будет сохранено состояние.

Возвращает True, чтобы обновить состояние Предпочтения с новым значением.

Таким образом, вы можете напрямую вернуть результат проверки ценности.

public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
     findPreference("mail_preference_key").setOnPreferenceChangeListener(
      new Preference.OnPreferenceChangeListener() { 

      @Override 
      public boolean onPreferenceChange(Preference preference, Object newValue) { 
       return Pattern.matches("mailPattern", (String) newValue); 
      } 

     }); 
    } 
} 
+0

У меня есть следующий код: \t \t если (key.equals ("update_delay")) { \t \t \t Строка Новое_значение = sp.getString (ключ, нуль) ; .. \t \t \t, если (Integer.parseInt (NewValue) <60) \t \t \t \t sp.edit() putString ("update_delay", "60") фиксации(); } , и в следующий раз, когда я нажимаю на EditTextPreference, он все еще показывает низкое значение. Знаете ли вы, что commit() не работает в этом контексте? – sargas

+0

Я не уверен, но в методе метода фиксации указывается 1. Обратите внимание, что, когда два редактора изменяют предпочтения в одно и то же время, последний для вызова совершает выигрыши. 2. Возвращает true, если новые значения были успешно записаны в постоянное хранилище. Пункт 1: Возможно, пользовательский редактор совершает последний звонок. Пункт 2: Проверьте, верен ли commit. Надеюсь, что эта помощь. – Fede

+1

Разве это не называется после того, как изменение сделано? Я полагаю, что Аарон имеет правильный ответ. – iozee

2

Я хотел бы использовать Preference.OnPreferenceChangeListener вместо SharedPreferences.OnSharedPreferenceChangeListener.

Первый позволяет проверить новое значение до его сохранения (и предотвратить его сохранение), а не после.

9

Ваш вопрос был ранним хитом Google, когда я пытался сделать то же самое, поэтому, надеюсь, это помогает кому-то. Вот что я сегодня взломал, демонстрируя OnPreferenceChangeListener, что позволяет остановить недействительные изменения.

в вашем фрагменте:

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

     Your_Pref = (EditTextPreference) getPreferenceScreen().findPreference("Your_Pref"); 

     Your_Pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 

      @Override 
      public boolean onPreferenceChange(Preference preference, Object newValue) { 
       Boolean rtnval = true; 
       if (Your_Test) { 
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
        builder.setTitle("Invalid Input"); 
        builder.setMessage("Something's gone wrong..."); 
        builder.setPositiveButton(android.R.string.ok, null); 
        builder.show(); 
        rtnval = false; 
       } 
       return rtnval; 
      } 
     }); 
    }