Как создать DialogPreference программно? - PullRequest
1 голос
/ 24 апреля 2011

История моего вопроса в том, что я хотел бы создать меню, аналогичное настройкам «Wifi Networks» на моем 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 ).Я не могу написать конструктор без AttributeSet , потому что базовый класс DialogPreference требует AttributeSet .

Я пытался создать AttributeSet через Xml.asAttributeSet (XmlPullParser) , но я понятия не имею, что передать XmlPullParser .AttributeCount всегда был -1, что явно неверно.Весь подход через парсер кажется мне сложным.

Целевой уровень API - 8.

Выдержка из предпочтений.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 Ответ

0 голосов
/ 14 июля 2011

Я не уверен, что это уместно, но именно так я загрузил 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?

...