2013-06-16 2 views
1

Я пытаюсь установить новый пароль с помощью EditTextPreference. В этом Android 4.0.3 щелчок по EditTextPreference открывает диалоговое окно, в котором пользователь может вводить текст. Однако при нажатии ok он по-прежнему показывает старое текстовое значение, а не новое введенное значение.Как получить обновленное текстовое значение из EditTextPreference - оно получает старое значение

public class MyPreferencesActivity extends PreferenceActivity { 

EditTextPreference edp_password = (EditTextPreference) findPreference("pref_key_account_password"); 

edp_password.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){ 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      String password = edp_password.getText(); 
      Log.v(TAG, "Password is: " + password); 
      return true; 
     } 
    }); 

Я провожу время, пытаясь заставить его работать, но не смог найти подходящего решения. Как я могу получить вновь введенный текст после нажатия пользователем «ОК».

+0

лишь некоторые советы для хранения паролей: http://stackoverflow.com/questions/785973/what-is-the-most-appropriate-way-to-store-user-settings-in-android -приложение – wrapperapps

+0

Спасибо. В реальных приложениях я добавляю их с повторно генерируемым значением, которое только я мог бы правильно генерировать, а затем зашифровать всю строку перед сохранением. – zeeshan

ответ

0

ОК, я думаю, я знаю, в чем проблема, из ссылок разработчиков Android, говорится, что этот обратный вызов вызывается до того, как внутреннее состояние было обновлено, поэтому я предполагаю, что вы видите старое значение.

, как вы делали это было прекрасно, но я предполагаю что вам нужно использовать объект NEWVALUE, может быть что-то вроде этого:

public class MyPreferencesActivity extends PreferenceActivity { 

EditTextPreference edp_password = (EditTextPreference)  findPreference("pref_key_account_password"); 

edp_password.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){ 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 

     Log.v(TAG, "Password is: " + (EditText)newValue.getText()); 
     return true; 
    } 
}); 

Я не уверен, если это работает, я только бесплатно записи это: P

+0

Это действительно помогло моей нынешней ситуации. Спасибо за отправку кода. TextWatcher был моим резервным вариантом, я использовал его один раз раньше, но так как он наблюдает за каждым нажатием клавиши, что является ненужным, поэтому я хотел чего-то более изящного способа выполнить это, то есть после нажатия Ok вы просто получаете конечный вход. Однако, если нет другого способа сделать это, я приму ваш ответ в качестве окончательного ответа. Возможно, это побудит меня расширить мой код, чтобы сделать проверку пароля типа AJAX. – zeeshan

+0

ok Я думаю, что знаю, в чем проблема, из ссылок разработчиков Android, говорится, что этот обратный вызов вызывается до того, как внутреннее состояние обновлено, поэтому я предполагаю, что вы видите старое значение. –

+0

Вы правы, я также читал это. Но мне было интересно, что должен быть способ получить то, что обновляется после изменения текста. Мне также нужно добавить еще несколько EditTextPreferences и было бы более чистым, чтобы извлекать новые значения, используя какой-то более простой код, используя что-то вроде getText(). – zeeshan

2

Попробуйте так:

EditTextPreference pref_dayCount = (EditTextPreference)findPreference("pref_dayCount"); 
pref_dayCount.setDefaultValue(30); 
pref_dayCount.setSummary(getResources().getString(R.string.pref_plan_days_number_summary)+" "+pref_dayCount.getText()); 
pref_dayCount.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
      preference.setSummary(getResources().getString(R.string.pref_plan_days_number_summary)+" "+newValue.toString());  
     return true; 
    } 
}); 
0

password.getText не получит обновленное значение. Использование:

String password = newValue.toString();