- Android programmers blog
- Поиск по этому блогу
- понедельник, 4 февраля 2013 г.
- Работа с настройками в Android
- EditTextPreference-только числовое значение inputType — не работает
- 8 ответов
- Похожие вопросы:
- EditTextPreference – только числовое значение inputType – не работает
- EditTextPreference
- Class Overview
- Summary
- Public Constructors
- public EditTextPreference (Context context, AttributeSet attrs, int defStyle)
- public EditTextPreference (Context context, AttributeSet attrs)
- public EditTextPreference (Context context)
- Public Methods
- public EditText getEditText ()
- public String getText ()
- public void setText (String text)
- public boolean shouldDisableDependents ()
- Protected Methods
- protected void onAddEditTextToDialogView (View dialogView, EditText editText)
- protected void onBindDialogView (View view)
- protected void onDialogClosed (boolean positiveResult)
- protected Object onGetDefaultValue (TypedArray a, int index)
- protected void onRestoreInstanceState (Parcelable state)
- protected Parcelable onSaveInstanceState ()
- protected void onSetInitialValue (boolean restoreValue, Object defaultValue)
Android programmers blog
Simply about difficult
Поиск по этому блогу
понедельник, 4 февраля 2013 г.
Работа с настройками в Android
Сегодня я хочу с вами поделиться некоторым опытом работы с настройками в android. Это будет небольшой туториал для начинающих ну и собсно что-то такое куда можно будет заглянуть накануне когда понадобятся настройки и скопипастить нужный кусок к себе в проект.
Начну с того что для примера мы напишем недопрограмму в которой будет всего два файла: файл настроек и главная активность в которой будет показываться что выбрали. Все будет просто, на главной активносте будет поле текстовое в котором можно будет писать текст, и текствью который нам никак не пригодится. На активности будет меню для перехода в настройки.
Для начала создаем проект и открываем наш main.xml, сейчас мы туда впилим нашу разметку главной активити. Вот так вот она будет выглядеть:
Смотреться на телефоне в дневном режиме вот так будет:
Дальше в созданном MainActivity добавляем меню:
Далее нам нужно создать подпапочку res/xml и внутри этой папки создать файл prefs.xml. Начнем мы с CheckBoxPreference.
CheckBoxPreference
Тут мы добавили обычный чекбокс для включения или отключения ночного режима в программе на едит тексте.
Дальше создаем файл PrefsAcitivity, его мы унаследуем не просто от активити а от PreferenceActivity для того что бы он определялся как активность настроек и сохранял все что мы там будет вытворять. Он будет выглядеть вот так вот:
Дальше нужно добавить эту активность в AndroidManifest так как если не добавите то и не откроете её.
Теперь давайте добавим в нашу главную активность обработку этого чекбокса который мы создали в настройках. Для этого нам нужно создать метод onResume() в котором будем все это красотень обрабатывать. Далее я не буду приводить весь код, а только метод onResume() в котором собственно и будет все происходить.
Для начала нам нужно объявить переменные для работы с настройками и с нашим текстовым полем. В шапке файла MainActivity добавляем вот такие поля:
В onCreate() же нам нужно эти поля идентифицировать что бы их можно было использовать так что далее пишем
Ну а теперь создаем метод onResume() в самом низу нашего файла и начинаем оживлять нашу разметку.
Начнем мы с чекбокса, он у нас должен вводить и выводить в/из ночного режима, давайте это реализуем:
Теперь если вы запустите и попробуете поставить / убрать в настройках галочку у вас будет меняться фоновый цвет в едит тексте.
EditTextPreference
И так научились мы менять цвет поля из настроек давайте теперь научимся увеличивать шрифт из них. Для этого нам понадобится EditTextPreference который позволяет вводить нам произвольные числа и разный текст, но так как мы хотим ввести размер то будем вводить только цифры.
Все также как и в чекбоксе то же поля ключ, то же название и т.д. Как нам получить параметр который будет введен в поле EditTextPreferences? А вот так!
Вот таким образом мы получим цифры из текстбокса которые введет пользователь в настройках.
Выглядит вот так
ListPreference
Теперь мы хотим менять стиль текста, он у нас может быть жирный, курсивный, подчеркнутый и полужирный курсив. Для того что бы такое сделать нам нужно добавить в наши настройки ListPreference который позволяет создавать списки с радибаттонами или с чекбоксами.
Для того что бы создать список нам нужно создать массив этих вариантов. Создаем файл text_style.xml в папке res/values и пишем в нем вот такой вот массив:
Дальше в файле preferences.xml нам нужно создать ListPreferences и задать ему генерировать массив из этого файла.
Теперь наш preferences.xml будет выглядеть вот так:
Теперь для обработки этого элемента немного видоизменим наш onResume() добавим туда еще пару строк кода для обработки / чтения параметров.
Из комментариев понятно что и как тут происходит. Выглядеть вот так будет:
Ну теперь давайте добавим последний элемент который я очень долго искал но все таки нашел как его сделать, это кнопка перехода из настроек на другую активность, например вам захотелось в настройках добавить какую-то сложную функцию например как калибровка экрана, для этого вы создали активность и в ней делаете все что вам нужно, для того что бы перейти из настроек на эту активность вам нужно создать кнопку в preferences.xml.
И дальше в файле PrefsActivity нужно написать метод который будет обрабатывать клик, в нашем случае мы будем переходить обратно на нашу активность, но вообще это делается для скрытых настроек.
Собственно это все что я хотел рассказать про настройки, там еще есть уйма разных елементов но это основные которые я использовал и которые я буду использовать в дальнейшем. Спасибо за внимание, исходник проекта лежит ниже.
Сами настройки будут вот так выглядеть:
Скачать с GitHub & Скачать с Dropbox
Источник
EditTextPreference-только числовое значение inputType — не работает
Он по-прежнему показывает обычную клавиатуру и позволяет мне вводить любой символ
Что-то не так с android.support.v7 ?
8 ответов
Я надеюсь, что EditTextPreference принимает только значение между 6000 и 65536, как я могу это сделать? Спасибо! BTW, код а не работает, я не могу ввести ни одного числа в поле редактирования EditTextPreference, ключ которого равен WebServerPort
используйте это в edittext, так как он принимает только определенные числа. если он не работает, используйте библиотеку Android-Support-Preference-V7-Fix.
Исправлено EditTextPreference пересылает атрибуты XML (например, inputType) в EditText, как и исходное предпочтение.
В разделе Настройка параметров руководства разработчика по настройкам рекомендуется установить тип ввода программно с помощью OnBindEditTextListener следующим образом:
Я попытался определить тип ввода как «number» в xml и все равно получил обычную клавиатуру с буквами. Этот подход сработал для меня.
Я согласен, что в исходных настройках поддержки есть некоторые проблемы, но для решения этой проблемы нам просто нужно добавить пользовательский макет и указать EditText с android:inputType=»number»
Чтобы вы могли скопировать исходный файл preference_dialog_layout.xml и отредактировать его.
Я пытаюсь установить значение для элемента EditTextPreference с hostPreference.setText(Not yet set); Но текст не показывается Я хочу показать его как Use Name здесь public class HostSettingActivity extends PreferenceActivity < private final String MY_DEBUG_TAG = SettingActivity; SharedPreferences.
как установить только числовое значение для EditTextPreference в android. Я хочу, чтобы пользователь ввел номер порта, не зная, как я могу поставить там ограничение Я использую этот код, пользователь может ввести любую строку. Хотите ограничить пользователя по крайней мере только номерами.
Это происходит при использовании android.support.v14.preference.PreferenceFragment или android.support.v7.preference.PreferenceFragmentCompat даже после выбора android:inputType=»numberDecimal» . Эту проблему можно решить с помощью android.preference.PreferenceFragment . К сожалению, он устарел в API уровне 28.
android.support.v7.preference.EditTextPreference не содержит метода getEditText() .
Но мы можем расширить android.support.v7.preference.EditTextPreferenceDialogFragmentCompat до inputType.
Затем сделайте свою деятельность PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback
Используйте свой EditTextPreferenceDialogFragmentCompat вместо android.support.v7.preference.EditTextPreferenceDialogFragmentCompat
просто используйте android.support.v7.preference.EditTextPreference в xml
Вы можете получить EditText из предпочтения и оттуда setInputTypes или использовать KeyListeners для информирования клавиатуры:
Подумал, что я добавлю свое решение для Android-TV на случай, если кто-то придет сюда и ему это понадобится. ответ android_su направил меня в правильном направлении, к сожалению, LeanbackEditTextPreferenceDialogFragmentCompat не поддерживает OnPreferenceDisplayDialogCallback . Вместо этого мне пришлось:
переопределите onCreateView и реализуйте новую функцию newInstance для LeanbackEditTextPreferenceDialogFragmentCompat с помощью наследования:
переопределить onPreferenceDisplayDialog внутри моего LeanbackSettingsFragmentCompat :
EditTextPreference виджеты должны принимать те же атрибуты, что и обычные EditText, поэтому используйте:
Похожие вопросы:
Я создал EditTextPreference и теперь хочу получить ценность от любой другой деятельности. Я много чего пробовал, но ничего не получалось. Где хранится это значение? Как я могу его вернуть? EDIT: я.
Я хочу проверить значение EditTextPreference , чтобы оно находилось внутри определенного диапазона int (скажем, от 1 до 22). Единственная часть, которую я мог проверить, была inputType (только.
Я хочу изменить inputType в моем EditPreferences:
Источник
EditTextPreference – только числовое значение inputType – не работает
Он по-прежнему показывает обычную клавиатуру и позволяет мне набирать любой символ
Что-то не так с android.support.v7 ?
используйте это в edittext, поскольку он принимает только определенные числа. если он не работает, используйте Android-Support-Preference-V7-Fix.
Исправлено редактирование EditTextPreference пересылает атрибуты XML (например, inputType) в EditText, как и исходное предпочтение.
android.support.v7.preference.EditTextPreference не содержит getEditText() .
Но мы можем расширить android.support.v7.preference.EditTextPreferenceDialogFragmentCompat чтобы установить inputType.
Затем сделайте вашу деятельность реализующей PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback
Используйте свой EditTextPreferenceDialogFragmentCompat вместо android.support.v7.preference.EditTextPreferenceDialogFragmentCompat
просто используйте android.support.v7.preference.EditTextPreference в xml
Вы можете получить EditText из Preference и оттуда setInputTypes или использовать KeyListeners, чтобы сообщить клавиатуре:
Я согласен с тем, что исходные параметры поддержки имеют некоторые проблемы, но для решения этой проблемы нам просто нужно добавить пользовательский макет и указать EditText с помощью android: inputType = “number”
Чтобы вы могли скопировать исходный файл preference_dialog_layout.xml и отредактировать его.
Это происходит при использовании android.support.v14.preference.PreferenceFragment или android.support.v7.preference.PreferenceFragmentCompat даже после выбора android:inputType=»numberDecimal» . Эта проблема может быть преодолена с помощью android.preference.PreferenceFragment. К сожалению, это устарело на уровне API 28.
Думаю, я бы добавил свое решение для Android-TV на случай, если кто-то попадет сюда и понадобится. Ответ android_su направил меня в правильном направлении, к сожалению, LeanbackEditTextPreferenceDialogFragmentCompat не поддерживает OnPreferenceDisplayDialogCallback . Вместо этого я должен был:
Переопределите onCreateView и реализуйте новую функцию newInstance для LeanbackEditTextPreferenceDialogFragmentCompat используя наследование:
переопределить onPreferenceDisplayDialog внутри моего LeanbackSettingsFragmentCompat :
Эй, попробуйте Это, чтобы вывести клавиатуру только с номерами
Виджеты EditTextPreference должны иметь те же атрибуты, что и обычный EditText, поэтому используйте:
Источник
EditTextPreference
java.lang.Object | |||
↳ | android.preference.Preference | ||
↳ | android.preference.DialogPreference | ||
↳ | android.preference.EditTextPreference |
Class Overview
A Preference that allows for string input.
It is a subclass of DialogPreference and shows the EditText in a dialog. This EditText can be modified either programmatically via getEditText() , or through XML by setting any EditText attributes on the EditTextPreference.
This preference will store a string into the SharedPreferences.
Summary
android:dialogIcon | The icon for the dialog. |
android:dialogLayout | A layout to be used as the content View for the dialog. |
android:dialogMessage | The message in the dialog. |
android:dialogTitle | The title in the dialog. |
android:negativeButtonText | The negative button text for the dialog. |
android:positiveButtonText | The positive button text for the dialog. |
android:defaultValue | The default value for the preference, which will be set either if persistence is off or persistence is on and the preference is not found in the persistent storage. |
android:dependency | The key of another Preference that this Preference will depend on. |
android:enabled | Whether the Preference is enabled. |
android:key | The key to store the Preference value. |
android:layout | The layout for the Preference in a PreferenceActivity screen. |
android:order | The order for the Preference (lower values are to be ordered first). |
android:persistent | Whether the Preference stores its value to the shared preferences. |
android:selectable | Whether the Preference is selectable. |
android:shouldDisableView | Whether the view of this Preference should be disabled when this Preference is disabled. |
android:summary | The summary for the Preference in a PreferenceActivity screen. |
android:title | The title for the Preference in a PreferenceActivity screen. |
android:widgetLayout | The layout for the controllable widget portion of a Preference. |
int | DEFAULT_ORDER | Specify for setOrder(int) if a specific order is not required. |
Public Constructors |
---|
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Public Constructorspublic EditTextPreference (Context context, AttributeSet attrs, int defStyle)public EditTextPreference (Context context, AttributeSet attrs)public EditTextPreference (Context context)Public Methodspublic EditText getEditText ()Returns the EditText widget that will be shown in the dialog. Returns
public String getText ()Gets the text from the SharedPreferences . Returnspublic void setText (String text)Saves the text to the SharedPreferences . Parameterspublic boolean shouldDisableDependents ()Checks whether this preference’s dependents should currently be disabled. Returns
Protected Methodsprotected void onAddEditTextToDialogView (View dialogView, EditText editText)Adds the EditText widget of this preference to the dialog’s view. Parametersprotected void onBindDialogView (View view)Binds views in the content View of the dialog to data. Make sure to call through to the superclass implementation. Parameters
protected void onDialogClosed (boolean positiveResult)Called when the dialog is dismissed and should be used to save data to the SharedPreferences . Parameters
protected Object onGetDefaultValue (TypedArray a, int index)Called when a Preference is being inflated and the default value attribute needs to be read. Since different Preference types have different value types, the subclass should get and return the default value which will be its value type. For example, if the value type is String, the body of the method would proxy to getString(int) . Parameters
Returns
protected void onRestoreInstanceState (Parcelable state)Hook allowing a Preference to re-apply a representation of its internal state that had previously been generated by onSaveInstanceState() . This function will never be called with a null state. Parameters
protected Parcelable onSaveInstanceState ()Hook allowing a Preference to generate a representation of its internal state that can later be used to create a new instance with that same state. This state should only contain information that is not persistent or can be reconstructed later. Returns
protected void onSetInitialValue (boolean restoreValue, Object defaultValue)Implement this to set the initial value of the Preference. If restorePersistedValue is true, you should restore the Preference value from the SharedPreferences . If restorePersistedValue is false, you should set the Preference value to defaultValue that is given (and possibly store to SharedPreferences if shouldPersist() is true). This may not always be called. One example is if it should not persist but there is no default value given. Источник |