如何解决触发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,int defStyleAttr)
{
super(context,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\");
}
});
立即工作。实际上,我从未想到过会如此轻松。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。