Android: программное создание окна настроек

Активити с настройками можно создать двумя способами: через файл XML из ресурсов, либо программынм способом. Опишу второй способ, т.к. именно с ним у меня возникла одна трудность - а именно добавление поля для ввода пароля, с поддержкой маскирования текста.

Первое - создаём активити с названием Preferences, базовым классом выбираем android.preference.PreferenceActivity:

  1. package net.galanov.android.preferencesdemo;
  2.  
  3. import android.os.Bundle;
  4. import android.preference.PreferenceActivity;
  5.  
  6. public class Preferences extends PreferenceActivity {
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setPreferenceScreen(createPreferenceHierarchy());
  11. }
  12. }

конфигурацию окна для настроек устанавливаем через метод setPreferenceScreen(), сама страница с деревом настроек будет формироваться методом createPreferenceHierarchy()

Второе - реализуем метод генерации элементов для редактирования настроек:

  1. private PreferenceScreen createPreferenceHierarchy() {
  2. // создаём корневой элемент для параметров - страницу preferences
  3. PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);
  4.  
  5. // создаём диалог для ввода логина
  6. EditTextPreference usernamePref = new EditTextPreference(this);
  7. // устанавливаем заголовок для диалогового окна (Username)
  8. usernamePref.setDialogTitle(R.string.pref_username_dialog_title);
  9. // устанавливаем ключ для этого параметра, по нему потом пожно будет получить значение параметра
  10. usernamePref.setKey("username");
  11. // устанавливаем заголовк для элемента страницы
  12. usernamePref.setTitle(R.string.pref_username_title);
  13. // устаналиваем подпись для элемента страницы
  14. usernamePref.setSummary(R.string.pref_username_summary);
  15. // добавляем элемент на страницу
  16. root.addPreference(usernamePref);
  17.  
  18. // аналогично добавляем элемент для воода пароля
  19. EditTextPreference passPref = new EditTextPreference(this);
  20. passPref.setDialogTitle(R.string.pref_password_dialog_title);
  21. passPref.setKey("password");
  22. passPref.setTitle(R.string.pref_password_title);
  23. passPref.setSummary(R.string.pref_password_summary);
  24.  
  25. // добавлеяем элемент на страницу
  26. root.addPreference(passPref);
  27.  
  28. // возвращаем ссылку на созданную страницу
  29. return root;
  30. }

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

  1. package net.galanov.android.preferencesdemo;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.Menu;
  7.  
  8. public class Main extends Activity {
  9. /** Called when the activity is first created. */
  10. @Override
  11. public void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.main);
  14. }
  15.  
  16. @Override
  17. public boolean onCreateOptionsMenu(]]>Menu]]> menu) {
  18. Intent intent = new Intent(this, Preferences.class);
  19. startActivity(intent);
  20. return false;
  21. }
  22. }

Вот что получилось:


Все бы хорошо, но пароль сейчас при редактировании показывается открытым текстом, что не очень хорошо. Чтобы вводимый пароль не было видно в конфигации настроек через XML файл в элемент добавляется атрибут android:password="true", в классе же EditTextPreference, как оказалось, нет параметра, который выставляет режим ввода с маскированием текста.
Покопавшить в API я нашел в поле ввода метод setTransformationMethod(), котрый принмает объект типа TransformationMethod. Наследником типа TransformationMethod является тип PasswordTransformationMethod, который как раз выполняет маскирование вводимого в поле текста.
Пол дела сделано - нужный метод найден, осталось получить объект поля ввода и применить метод. Получение самого редактора из элемента настроек делается через метод getEditText(). Одно замечание в метод setTransformationMethod() лучше передавать не новый объект PasswordTransformationMethod созданный через new PasswordTransformationMethod(), а полученный через PasswordTransformationMethod.getInstance(), иначе транформация будет происходить немного кривовато - текст будет заменяться на точку сразу при вводе и понять что вводишь будет сложно, а при использовании инстанца мы получим настроенный объект и преобразование в точку будет происходить с задержкой.
В итоге код генерации страницы настроек получается следущий:

  1. private PreferenceScreen createPreferenceHierarchy() {
  2. // создаём корневой элемент для параметров - страницу preferences
  3. PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);
  4.  
  5. // создаём диалог для ввода логина
  6. EditTextPreference usernamePref = new EditTextPreference(this);
  7. // устанавливаем заголовок для диалогового окна (Username)
  8. usernamePref.setDialogTitle(R.string.pref_username_dialog_title);
  9. // устанавливаем ключ для этого параметра, по нему потом пожно будет получить значение параметра
  10. usernamePref.setKey("username");
  11. // устанавливаем заголовк для элемента страницы
  12. usernamePref.setTitle(R.string.pref_username_title);
  13. // устаналиваем подпись для элемента страницы
  14. usernamePref.setSummary(R.string.pref_username_summary);
  15. // добавляем элемент на страницу
  16. root.addPreference(usernamePref);
  17.  
  18. // аналогично добавляем элемент для воода пароля
  19. EditTextPreference passPref = new EditTextPreference(this);
  20. passPref.setDialogTitle(R.string.pref_password_dialog_title);
  21. passPref.setKey("password");
  22. passPref.setTitle(R.string.pref_password_title);
  23. passPref.setSummary(R.string.pref_password_summary);
  24.  
  25. // добавлем метод для трансформации текста при вводе пароля
  26. <strong>passPref.getEditText().setTransformationMethod(PasswordTransformationMethod.getInstance());</strong>
  27. // добавлеяем элемент на страницу
  28. root.addPreference(passPref);
  29.  
  30. // возвращаем ссылку на созданную страницу
  31. return root;
  32. }

Теперь при вводе пароля - текст заменяется на точки:

PS: использованные строковые ресурсы:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string name="app_name">Preferences demo</string>
  4. <string name="preferences">Preferences</string>
  5. <string name="pref_username_dialog_title">Enter username</string>
  6. <string name="pref_username_title">Username</string>
  7. <string name="pref_username_summary">Enter your system username</string>
  8.  
  9. <string name="pref_password_dialog_title">Enter password</string>
  10. <string name="pref_password_title">Password</string>
  11. <string name="pref_password_summary">Enter your system password</string>
  12. </resources>
Прикрепленные файлыРазмер
Инсталятор примера14.65 кб
Исходный код11.22 кб

Комментарии

Спасибо за статью.

Как считать ключ?

Прочитать значение можно так:

  1. SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
  2. ]]>String]]> username = preferences.getString("username", "default_name");

где
this - контекст вызова, Activity или Application
"username" - название ключа
"default_name" - значение для ключа поумолчанию, вернётся если запрашиваемый ключ не будет найден

Отправить комментарий

  • Доступны HTML теги: <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • Search Engines will index and follow ONLY links to allowed domains.

Подробнее о форматировании

Введите решение задачи