在执行一些代码后,我遇到了一个问题,我想在应用的“设置”片段中更新当前显示的 listPreference 。
这是我要分步骤进行的操作:
在上面的(2b),这就是我正在做的:
listPreference = findPreference("mp_key");
listPreference.setEntries(cs);
listPreference.setEntryValues(cs);
//Call on Resume method of the Fragment
这就是发生的情况。 (2a)显示默认条目/值(来自xml文件),并且可见 (2b)一些代码运行并将新值写入 listPreference 。列表首选项视图/对话框仍然可见。 (3a)用户“选择一个项目”或“取消”它,列表视图消失,显示摘要 (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;
}
};
}
答案 0 :(得分:0)
我不确定“某些代码在后台运行并将新值写入listPreference(列表首选项视图/对话框仍然可见)”是什么意思,但添加了我的一个设置片段代码,其中有一个复选框和一个列表。希望这将引导您实现目标。
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);
}
}
答案 1 :(得分:0)
我还没有弄清楚为什么会这样,但是我想我没有连接到列表视图小部件来刷新它。我已决定放弃此策略,并继续采用其他策略。
感谢Tibor的投入。这就是我现在要做的: