Как создать DialogPreference программно?

#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-файле?