Android列表首选项视图刷新
我遇到了一个问题,在运行一些代码后,我想更新我应用程序设置片段中当前显示的listPreference 以下是我正在尝试的步骤: 将向用户显示设置视图 有一个列表首选项。当他点击时: 2a默认条目/值显示在xml文件中,并且是可见的 2b一些代码在后台运行,并将新值写入listPreference列表preference视图/对话框仍然可见。 2c现在我想更新此视图以显示新条目 在上面2b处,这是我正在做的:Android列表首选项视图刷新,android,android-listfragment,Android,Android Listfragment,我遇到了一个问题,在运行一些代码后,我想更新我应用程序设置片段中当前显示的listPreference 以下是我正在尝试的步骤: 将向用户显示设置视图 有一个列表首选项。当他点击时: 2a默认条目/值显示在xml文件中,并且是可见的 2b一些代码在后台运行,并将新值写入listPreference列表preference视图/对话框仍然可见。 2c现在我想更新此视图以显示新条目 在上面2b处,这是我正在做的: listPreference = findPreference("mp_key");
listPreference = findPreference("mp_key");
listPreference.setEntries(cs);
listPreference.setEntryValues(cs);
//Call on Resume method of the Fragment
下面是发生的情况。
2a默认条目/值显示在xml文件中,并且是可见的
2b运行一些代码并将新值写入listPreference。列表首选项视图/对话框仍然可见。
3用户选择项目或取消项目,列表视图消失并显示摘要
4当用户再次单击listPreference时,将显示新条目
//代码如下
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}
public class SettingsFragment extends PreferenceFragmentCompat {
private static ListPreference listPreference;
@Override
public void onCreatePreferences(Bundle bundle, String s) {
setPreferencesFromResource(R.xml.preferences, s);
listPreference = findPreference("mp_key"); //in xml resource, not provided here
listPreference.setOnPreferenceClickListener(listPrefClickListener);
}
Preference.OnPreferenceClickListener channelClickListener = new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
CharSequence[] cs = listToCharSequence; //test purposes
listPreference.setEntries(cs);
listPreference.setEntryValues(cs);
return false;
}
};
}
我不确定您所说的在后台运行某些代码并将新值写入listPreference列表preference视图/对话框是什么意思,但添加了一个设置片段代码,其中包含一个复选框和一个列表。希望这能指引你实现目标
public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener{
/**
* creating the preferences
* @param savedInstanceState saved instance state
* @param rootKey some key
*/
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.gl_preferences);
SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
PreferenceScreen prefScreen = getPreferenceScreen();
int count = prefScreen.getPreferenceCount();
for(int i = 0; i < count; i++){
Preference p = prefScreen.getPreference(i);
if(!(p instanceof CheckBoxPreference)){
String value = sharedPreferences.getString(p.getKey(), "");
setPreferenceSummary(p, value);
}
}
}
/**
* setting up the summary of the list preference
* @param preference that needs to have the summary set
* @param value summary
*/
private void setPreferenceSummary(Preference preference, String value){
if(preference instanceof ListPreference){
ListPreference listPreference = (ListPreference)preference;
int prefIndex = listPreference.findIndexOfValue(value);
if(prefIndex >= 0){
listPreference.setSummary(listPreference.getEntries()[prefIndex]);
}
}
}
/**
* Listener when the preferences change
* @param sharedPreferences that changed
* @param key that changed
*/
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference preference = findPreference(key);
if(null != preference) {
if(!(preference instanceof CheckBoxPreference)){
String value = sharedPreferences.getString(preference.getKey(), "");
setPreferenceSummary(preference, value);
}
}
}
/**
* Shared preference created
* @param savedInstanceState
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
/**
* cleaning up
*/
@Override
public void onDestroyView() {
super.onDestroyView();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
}我还没有弄清楚原因,但我想我没有连接到列表视图小部件来刷新它。我已经决定放弃这一点,继续采取不同的策略 感谢Tibor的投入。这就是我现在所做的: 以异步方式运行我的后台任务 任务完成时更新共享引用 显示首选项屏幕
我想通过重新绘制列表对话框来更新列表中显示的条目,因为我不希望用户离开listView屏幕。有可能吗?当SharedPref发生更改时,您正在更新摘要。