触发onPreferenceClick时如何动态填充ListPreference?

| 我有一个偏好活动,它的显示范围为ѭ1a0。可以在调用onCreate时填充列表,但是我想在用户单击列表时填充列表。
this is the java code
public class SettingsActivity extends PreferenceActivity implements OnPreferenceClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            addPreferencesFromResource(R.xml.settings);
        } catch (Exception e) {

        }

    }

    @Override
    public boolean onPreferenceClick(Preference preference) {

        if((preference instanceof ListPreference) && (preference.getKey().equals(\"language\"))){
            ListPreference lp = (ListPreference)preference;
            CharSequence[] entries = { \"English\", \"French\" };
            CharSequence[] entryValues = {\"1\" , \"2\"};
            lp.setEntries(entries);
            lp.setDefaultValue(\"1\");
            lp.setEntryValues(entryValues);
            return true;
        }
        return false;

    }
}
这是
settings.xml
(首选项):
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<PreferenceScreen
  xmlns:android=\"http://schemas.android.com/apk/res/android\">
    <PreferenceCategory android:title=\"General Settings\">
        <CheckBoxPreference android:key=\"enabled\"  android:title=\"Application Status\" android:summary=\"Enable or disable the application\" />
         <ListPreference 
         android:key=\"language\" 
         android:title=\"Language\"
         android:dialogTitle=\"Application language\" 
         android:summary=\"Select the Application language\"
         />
    </PreferenceCategory>
</PreferenceScreen>
我搜索了但没有结果!每当我单击该列表时,都会发生异常。     
已邀请:
        由于未初始化ListPreference对象,因此您将获得异常-您需要在XML中设置
entries
entryValues
属性,或者以编程方式在
onCreate()
中进行设置。 如果在初始化初始ListPreference对象之后需要动态更改列表中的项目,则需要将ѭ9直接附加到ListPreference对象。使用您在XML中指定的键来获取首选项的句柄。 由于填充
entries
entryValues
数组的代码必须同时在
onCreate()
onPreferenceClick
中运行,因此有必要将其提取到单独的方法
setListPreferenceData()
中,以避免重复。
public class SettingsActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            addPreferencesFromResource(R.xml.settings);
        } catch (Exception e) {

        }

        final ListPreference listPreference = (ListPreference) findPreference(\"language\");

        // THIS IS REQUIRED IF YOU DON\'T HAVE \'entries\' and \'entryValues\' in your XML
        setListPreferenceData(listPreference);

        listPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {

                setListPreferenceData(listPreference);
                return false;
            }
        });
    }

    protected static void setListPreferenceData(ListPreference lp) {
            CharSequence[] entries = { \"English\", \"French\" };
            CharSequence[] entryValues = {\"1\" , \"2\"};
            lp.setEntries(entries);
            lp.setDefaultValue(\"1\");
            lp.setEntryValues(entryValues);
    }
}
这是谷歌的DeskClock应用程序的另一个示例:     
        使用PreferenceFragment&JAVA设置密钥,而不是https://stackoverflow.com/a/13828912/1815624中所示的PreferenceActivity&XML,该答案基于: 如果想要的是在初始化初始ListPreference对象之后能够动态更改列表中的项目,则需要将ѭ9直接附加到ListPreference对象。使用您在JAVA源文件中指定的键(如
CUSTOM_LIST
)来获取首选项的句柄。 由于填充
entries
entryValues
数组的代码必须同时在
onCreate()
onPreferenceClick
中运行,因此有必要将其提取到单独的方法
setListPreferenceData()
中,以避免重复。
/**
 * This fragment shows data and sync preferences only. It is used when the
 * activity is showing a two-pane settings UI.
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class myCustomPreferenceFragment extends PreferenceFragment {

    final private String CUSTOM_LIST= \"custom_list\";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref_custom_frag);

        PreferenceCategory targetCategory = (PreferenceCategory) findPreference(\"CUSTOM_FRAG\");

        final ListPreference lp = setListPreferenceData((ListPreference) findPreference(CUSTOM_LIST), getActivity());

        lp.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {

                setListPreferenceData(lp, getActivity());
                return false;
            }
        });
        setHasOptionsMenu(true);
        targetCategory.addPreference(lp);

        bindPreferenceSummaryToValue(targetCategory);
        bindPreferenceSummaryToValue(lp);
    }

    protected ListPreference setListPreferenceData(ListPreference lp, Activity mActivity) {
        CharSequence[] entries = { \"One\", \"Two\", \"Three\" };
        CharSequence[] entryValues = { \"1\", \"2\", \"3\" };
        if(lp == null)
            lp = new ListPreference(mActivity);
        lp.setEntries(entries);
        lp.setDefaultValue(\"1\");
        lp.setEntryValues(entryValues);
        lp.setTitle(\"Number Of blahs\");
        lp.setSummary(lp.getEntry());
        lp.setDialogTitle(\"Number of Blah objects\");
        lp.setKey(CUSTOM_LIST);
        return lp;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home) {
            startActivity(new Intent(getActivity(), SettingsActivity.class));
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
XML布局:
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">
    <PreferenceCategory
        android:key=\"CUSTOM_FRAG\"
        android:title=\"Some Options\">

    </PreferenceCategory>
</PreferenceScreen>
    
        我扩展了ListPreference解决了这个问题。这很简单。
public class DListPref extends ListPreference
{
    public interface LoadingListener
    {
        void setData(ListPreference lp);
    }

    LoadingListener TheLL;

    public void setLoadingListener(LoadingListener l)
    {
        TheLL = l;
    }

    @Override
    protected void onPrepareDialogBuilder(AlertDialog.Builder builder)
    {
        if(TheLL!=null)
        {
            TheLL.setData(this);
        }
        super.onPrepareDialogBuilder(builder);
    }

    //Do not mind the rest of this class, as they are auto-generated boilerplate code.
    public DListPref(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
    {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    public DListPref(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
    }

    public DListPref(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public DListPref(Context context)
    {
        super(context);
    }
}
然后,我只是将名称更改为XML中的类。
<my.company.DListPref
    android:defaultValue=\"-1\"
    android:key=\"damn\"
    android:title=\"vegetables\"/>
然后我只是在onCreate上进行了此操作。
        DListPref lp = (DListPref) findPreference(\"damn\");

        lp.setLoadingListener(new DListPref.LoadingListener()
        {
            @Override
            public void setData(ListPreference lp)
            {
                lp.setEntries(new String[]{\"doge\", \"wow\"});
                lp.setEntryValues(new String[] {\"1\", \"2\"});
                lp.setDefaultValue(\"1\");
            }
        });
立即工作。实际上,我从未想到过会如此轻松。     

要回复问题请先登录注册