#android #android-preferences
#Android #android-настройки
Вопрос:
Суть моего вопроса в том, что я хотел бы создать меню, аналогичное настройкам «Сети Wi-Fi» на моем Samsung Galaxy S9000. В меню отображается список известных сетей и есть одна дополнительная запись списка с заголовком «Добавить новую сеть». Если вы нажмете на него, заполните диалоговое окно и нажмете «Ок», вы получите новый элемент списка. Пункт «Добавить новую сеть» все еще существует после этой процедуры.
Мой подход заключается в том, чтобы иметь PreferenceScreen с одним AdressDialogPreference, который является подклассом DialogPreference. Заголовок этого параметра установлен на «Добавить новый IP-адрес». Когда пользователь открывает диалоговое окно и вводит значения, заголовок AddressDialogPreference меняется с «Добавить новый IP-адрес» на значение, введенное пользователем в диалоговом окне, например «192.168.1.1».
Но теперь мне нужна новая AddressDialogPreference с заголовком «Добавить новый IP-адрес», потому что пользователь может захотеть добавить больше IP-адресов. Вот где я застрял. Я попробовал следующее:
@Override
protected void onDialogClosed(boolean positiveResult) {
if(!positiveResult)
return;
(...)
PreferenceScreen ps = (PreferenceScreen)pm.findPreference("validIPs");
ps.addPreference(new AddressDialogPreference(getContext(), attr ));
}
Но я понятия не имею, где я могу получить / создать соответствующий AttributeSet (параметр attr). Я не могу написать конструктор без набора атрибутов, потому что для базового класса DialogPreference требуется набор атрибутов.
Я попытался создать набор атрибутов через Xml.asAttributeSet (XmlPullParser), но я понятия не имею, что передавать в XmlPullParser. Значение attributeCount всегда было равно -1, что, очевидно, неверно. Весь подход с помощью синтаксического анализатора кажется мне слишком сложным.
Целевой уровень API равен 8.
Выдержка из preferences.xml:
<PreferenceScreen android:title="@string/validIPsHeadline"
android:summary="@string/validIPsSummary"
android:dependency="restrictIPs"
android:key="validIPs">
<com.websliders.preferences.AddressDialogPreference
android:title="@string/defaultIPHeadline"
android:summary="@string/defaultIPSummary" />
</PreferenceScreen>
Ответ №1:
Я не уверен, уместно ли это, но именно так я загрузил AttributeSet в SeekBarPreference (из http://android.hlidskialf.com/blog/code/android-seekbar-preference ), который также является производным от класса DialogPreference.
В вашем предпочтенииактивность:
public PreferenceScreen getPreferenceScreen(String title, String summary) {
// Root
PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);
PreferenceCategory inlinePrefCat = new PreferenceCategory(this);
inlinePrefCat.setTitle("DNA");
root.addPreference(inlinePrefCat);
//This is where you load the AttributeSet
//from the res/layouts/seekbarpreference_layout.xml file
Preference editTextPref;
Resources resources = this.getResources();
XmlPullParser parser = resources.getXml(R.layout.seekbarpreference_layout);
AttributeSet attributes = Xml.asAttributeSet(parser);
editTextPref = new SeekBarPreference(this, attributes);
editTextPref.setKey(title);
editTextPref.setTitle(title);
editTextPref.setSummary(summary);
//editTextPref.setText(text)
inlinePrefCat.addPreference(editTextPref);
return root;
}
И это «res/layouts/seekbarpreference_layout.xml «файл:
<?xml version="1.0" encoding="utf-8"?>
<com.hlidskialf.android.preference.SeekBarPreference
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="duration"
android:title="Duration of something"
android:summary="How long something will last"
android:dialogMessage="Something duration"
android:defaultValue="5"
android:text=" minutes"
android:max="60"
/>
Если у вас это не работает, возможно, вам не хватает обязательного атрибута в XML-файле?