如何以编程方式创建DialogPreference?

时间:2011-04-24 19:24:31

标签: android android-preferences

我的问题的背景是我想创建一个菜单,就像我的三星Galaxy S9000上的“Wifi Networks”设置一样。该菜单显示已知网络列表,并有一个标题为“添加新网络”的附加列表条目。如果单击它,请填写对话框并单击“确定”,您将获得一个新的列表项。此过程后,“添加新网络”项仍然存在。

我的方法是使用一个 AdressDialogPreference 来创建 PreferenceScreen ,这是 DialogPreference 的子类。此首选项的标题设置为“添加新IP地址”。当用户打开对话框并输入值时, AddressDialogPreference 的标题从“添加新IP地址”变为用户在对话框中输入的值,例如“192.168.1.1”。

但是现在我需要一个标题为“添加新IP地址”的新 AddressDialogPreference ,因为用户可能想要添加更多的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

我尝试通过 Xml.asAttributeSet(XmlPullParser)创建一个AttributeSet,但我不知道要向 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 个答案:

答案 0 :(得分:0)

我不确定这是否相关,但这是我将一个AttributeSet加载到SeekBarPreference(来自http://android.hlidskialf.com/blog/code/android-seekbar-preference)的方式,它也是从DialogPreference类派生的。

在PreferenceActivity中:

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文件中的必需属性?