Android: программное создание окна настроек
Активити с настройками можно создать двумя способами: через файл XML из ресурсов, либо программынм способом. Опишу второй способ, т.к. именно с ним у меня возникла одна трудность - а именно добавление поля для ввода пароля, с поддержкой маскирования текста.
Первое - создаём активити с названием Preferences, базовым классом выбираем android.preference.PreferenceActivity:
package net.galanov.android.preferencesdemo; import android.os.Bundle; import android.preference.PreferenceActivity; public class Preferences extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setPreferenceScreen(createPreferenceHierarchy()); } }
конфигурацию окна для настроек устанавливаем через метод setPreferenceScreen()
, сама страница с деревом настроек будет формироваться методом createPreferenceHierarchy()
Второе - реализуем метод генерации элементов для редактирования настроек:
private PreferenceScreen createPreferenceHierarchy() { // создаём корневой элемент для параметров - страницу preferences PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this); // создаём диалог для ввода логина EditTextPreference usernamePref = new EditTextPreference(this); // устанавливаем заголовок для диалогового окна (Username) usernamePref.setDialogTitle(R.string.pref_username_dialog_title); // устанавливаем ключ для этого параметра, по нему потом пожно будет получить значение параметра usernamePref.setKey("username"); // устанавливаем заголовк для элемента страницы usernamePref.setTitle(R.string.pref_username_title); // устаналиваем подпись для элемента страницы usernamePref.setSummary(R.string.pref_username_summary); // добавляем элемент на страницу root.addPreference(usernamePref); // аналогично добавляем элемент для воода пароля EditTextPreference passPref = new EditTextPreference(this); passPref.setDialogTitle(R.string.pref_password_dialog_title); passPref.setKey("password"); passPref.setTitle(R.string.pref_password_title); passPref.setSummary(R.string.pref_password_summary); // добавлеяем элемент на страницу root.addPreference(passPref); // возвращаем ссылку на созданную страницу return root; }
Третье - настройки для простоты запустим просто по нажатии на кнопку меню, для этого надо добавить в обработку нажатия этой кнопки вызов страницы настроек:
package net.galanov.android.preferencesdemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override Intent intent = new Intent(this, Preferences.class); startActivity(intent); return false; } }
Вот что получилось:
Все бы хорошо, но пароль сейчас при редактировании показывается открытым текстом, что не очень хорошо. Чтобы вводимый пароль не было видно в конфигации настроек через XML файл в элемент добавляется атрибут android:password="true", в классе же EditTextPreference, как оказалось, нет параметра, который выставляет режим ввода с маскированием текста.
Покопавшить в API я нашел в поле ввода метод setTransformationMethod()
, котрый принмает объект типа TransformationMethod
. Наследником типа TransformationMethod
является тип PasswordTransformationMethod
, который как раз выполняет маскирование вводимого в поле текста.
Пол дела сделано - нужный метод найден, осталось получить объект поля ввода и применить метод. Получение самого редактора из элемента настроек делается через метод getEditText()
. Одно замечание в метод setTransformationMethod()
лучше передавать не новый объект PasswordTransformationMethod
созданный через new PasswordTransformationMethod()
, а полученный через PasswordTransformationMethod.getInstance()
, иначе транформация будет происходить немного кривовато - текст будет заменяться на точку сразу при вводе и понять что вводишь будет сложно, а при использовании инстанца мы получим настроенный объект и преобразование в точку будет происходить с задержкой.
В итоге код генерации страницы настроек получается следущий:
private PreferenceScreen createPreferenceHierarchy() { // создаём корневой элемент для параметров - страницу preferences PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this); // создаём диалог для ввода логина EditTextPreference usernamePref = new EditTextPreference(this); // устанавливаем заголовок для диалогового окна (Username) usernamePref.setDialogTitle(R.string.pref_username_dialog_title); // устанавливаем ключ для этого параметра, по нему потом пожно будет получить значение параметра usernamePref.setKey("username"); // устанавливаем заголовк для элемента страницы usernamePref.setTitle(R.string.pref_username_title); // устаналиваем подпись для элемента страницы usernamePref.setSummary(R.string.pref_username_summary); // добавляем элемент на страницу root.addPreference(usernamePref); // аналогично добавляем элемент для воода пароля EditTextPreference passPref = new EditTextPreference(this); passPref.setDialogTitle(R.string.pref_password_dialog_title); passPref.setKey("password"); passPref.setTitle(R.string.pref_password_title); passPref.setSummary(R.string.pref_password_summary); // добавлем метод для трансформации текста при вводе пароля <strong>passPref.getEditText().setTransformationMethod(PasswordTransformationMethod.getInstance());</strong> // добавлеяем элемент на страницу root.addPreference(passPref); // возвращаем ссылку на созданную страницу return root; }
Теперь при вводе пароля - текст заменяется на точки:
PS: использованные строковые ресурсы:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Preferences demo</string> <string name="preferences">Preferences</string> <string name="pref_username_dialog_title">Enter username</string> <string name="pref_username_title">Username</string> <string name="pref_username_summary">Enter your system username</string> <string name="pref_password_dialog_title">Enter password</string> <string name="pref_password_title">Password</string> <string name="pref_password_summary">Enter your system password</string> </resources>
Прикрепленные файлы | Размер |
---|---|
Инсталятор примера | 14.65 кб |
Исходный код | 11.22 кб |
- Метки:
Комментарии
Спасибо за статью.
Как считать ключ?
Прочитать значение можно так:
где
this - контекст вызова, Activity или Application
"username" - название ключа
"default_name" - значение для ключа поумолчанию, вернётся если запрашиваемый ключ не будет найден
Отправить комментарий