Android列表偏好设置视图刷新

时间:2020-01-03 22:13:05

标签: android android-listfragment

在执行一些代码后,我遇到了一个问题,我想在应用的“设置”片段中更新当前显示的 listPreference

这是我要分步骤进行的操作:

  1. 显示给用户一个设置视图
  2. 有一个列表首选项。当他单击时: (2a)显示默认条目/值(来自xml文件),并且可见 (2b)一些代码在后台运行,并将新值写入 listPreference (列表首选项视图/对话框仍然可见)。 (2c)现在,我想更新此视图以显示新条目

在上面的(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;
        }
    };
}

2 个答案:

答案 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的投入。这就是我现在要做的:

  1. 异步运行我的后台任务
  2. 完成任务时更新共享引用
  3. 显示偏好设置屏幕