如何将ListPreference的摘要修改为用户选择的新"Entry"字符串(而不是条目值)
我用setOnPreferenceChangeListener()来支持它
new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
using((ListPreference)preference).getEntry()我得到旧值(因为它还没有更改),newValue.toString()返回条目值(不是显示给用户的条目文本)
我该怎么做?提前致谢
Mic*_*ael 39
只需%s在xml描述中设置汇总值即可.
编辑:我已经在几个设备上测试过它并没有真正起作用.这很奇怪,因为根据文档它必须工作:ListPreference.getSummary().
但是可以自己实现这个功能.实现需要从ListPreference类继承:
public class MyListPreference extends ListPreference {
public MyListPreference(final Context context) {
this(context, null);
}
public MyListPreference(final Context context, final AttributeSet attrs) {
super(context, attrs);
}
@Override
public CharSequence getSummary() {
final CharSequence entry = getEntry();
final CharSequence summary = super.getSummary();
if (summary == null || entry == null) {
return null;
} else {
return String.format(summary.toString(), entry);
}
}
@Override
public void setValue(final String value) {
super.setValue(value);
notifyChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见MyListPreference,它有自己的摘要字段,可以包含格式标记.并且当首选项的值发生更改时,Preference.notifyChanged()将调用方法并调用MyListPreference.getSummary()方法Preference.onBindView().
PS:这种方法尚未经过充分测试,因此可能包含错误.
该%s实施是马车.视图在第一次加载时显示正确的值(如果设置了默认列表值),但在选择列表项时视图不会更新.您必须切换复选框或其他首选项才能更新视图.
作为解决方法,实现OnSharedPreferenceChangeListener覆盖列表首选项的摘要.
/src/apps/app_settings/SettingsActivity.java
package apps.app_settings;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class SettingsActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* set fragment */
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}
}
Run Code Online (Sandbox Code Playgroud)
/src/apps/app_settings/SettingsFragment.java
package apps.app_settings;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* set preferences */
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
/* get preference */
Preference preference = findPreference(key);
/* update summary */
if (key.equals("list_0")) {
preference.setSummary(((ListPreference) preference).getEntry());
}
}
@Override
public void onResume() {
super.onResume();
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
}
Run Code Online (Sandbox Code Playgroud)
/res/xml/preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:key="list_0"
android:title="@string/settings_list_0_title"
android:summary="%s"
android:entries="@array/settings_list_0_entries"
android:entryValues="@array/settings_list_0_entry_values"
android:defaultValue="@string/settings_list_0_default_value"/>
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="settings_list_0_title">list 0</string>
<string-array name="settings_list_0_entries">
<item>item 0</item>
<item>item 1</item>
<item>item 2</item>
</string-array>
<string-array name="settings_list_0_entry_values">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
<string name="settings_list_0_default_value">0</string>
</resources>
Run Code Online (Sandbox Code Playgroud)
我用另一个简单的解决方案解决了这个问题(https://gist.github.com/brunomateus/5617025):
public class ListPreferenceWithSummary extends ListPreference{
public ListPreferenceWithSummary(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListPreferenceWithSummary(Context context) {
super(context);
}
@Override
public void setValue(String value) {
super.setValue(value);
setSummary(value);
}
@Override
public void setSummary(CharSequence summary) {
super.setSummary(getEntry());
}
}
Run Code Online (Sandbox Code Playgroud)
这在我的GirgerBeard设备上非常好用.即使是第一次运行你的应用程序.不要忘记在xml prefence上提供默认值:
android:defaultValue="default value"
Run Code Online (Sandbox Code Playgroud)
并在您的PreferenceActivity或上设置默认值PrefenceFragment:
PreferenceManager.setDefaultValues(this, R.xml.you pref file, false);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20700 次 |
| 最近记录: |