首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何评估Checkboxpreference?

如何评估Checkboxpreference?
EN

Stack Overflow用户
提问于 2019-06-18 00:55:43
回答 1查看 35关注 0票数 0

我想评估checkboxpreference,从这里尝试了一些方法,但都不起作用。我需要获取OnSharedPreferenceChangeListener中的值,而不是PreferenceActivity中的值。它给出了一个错误,比如: ava.lang.ClassCastException: android.app.SharedPreferencesImpl不能被转换为android.support.v7.preference.CheckBoxPreference,有人能解释这个问题吗?

代码语言:javascript
复制
sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                Log.d(MainActivity.this.getClass().getSimpleName(), "Einstellungen wurde geändert.");
                prefsChanged = true;
                if(key.equals("use_gps")) {
                    //TODO: CheckBox evaluate and LocationUpdate start or remove if it's not checked
CheckBoxPreference preference = (CheckBoxPreference) getSharedPreferences("use_gps", MODE_PRIVATE);
                 if(preference.isChecked()) {
                     requestLocationUpdates();
                     Log.d(getClass().getSimpleName(), "preference ischecked");
                 } else {
                     removeLocationUpdates();
                     Log.d(getClass().getSimpleName(), " preference isnotchecked");
                 }


                }

            }
        };

感谢您的帮助,解决方案在MAinActivity onCreate()中:

代码语言:javascript
复制
if(key.equals("use_gps")) {
                    //TODO: CheckBox auswerten udn ggfs. Standortbestimmung starten oder stoppen
                    boolean checkbox = sharedPreferences.getBoolean("use_gps", true);
                    if (checkbox == true){
                        Toast.makeText(MainActivity.this, "true", Toast.LENGTH_LONG).show();
                        requestLocationUpdates();
                    } else {
                        Toast.makeText(MainActivity.this, "false", Toast.LENGTH_LONG).show();
                        removeLocationUpdates();
                    }

                }

            }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-18 02:11:59

这应该会有所帮助,而不是使用OnSharedPreferenceChangeListener(),使用registerOnSharedPreferenceChangeListener()将侦听器链接到首选项之外的任何首选项

非首选项活动的代码片段,您要在该活动中附加首选项的侦听器:

代码语言:javascript
复制
SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(this);

prefs.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener()
{
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
    {
       Log.v("CHANGE ", "YES");

       boolean use_gps_stat = sharedPreferences.getBoolean("use_gps", true);

       if(key == "use_gps")
       {
           Toast.makeText(getApplicationContext(), "Changed", Toast.LENGTH_LONG).show();
           if(use_gps_stat)
           {
               Toast.makeText(getApplicationContext(), "Checked", Toast.LENGTH_LONG).show();

               requestLocationUpdates();
               Log.d(getClass().getSimpleName(), "preference ischecked");
           }
           else
           {
               Toast.makeText(getApplicationContext(), "Unchecked", Toast.LENGTH_LONG).show();

               removeLocationUpdates();
               Log.d(getClass().getSimpleName(), " preference isnotchecked");
           }
       }
    }
});

在您的首选项活动中,将以下内容添加到overriden onCreate

代码语言:javascript
复制
bindPreferenceSummaryToValue_CheckBox(findPreference("use_gps"));

所以它应该看起来像这样:

代码语言:javascript
复制
public static class MainPreferenceFragment extends PreferenceFragment 
{
    @Override
    public void onCreate(final Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preference);      
        bindPreferenceSummaryToValue_CheckBox(
                         findPreference("use_gps"));
    .
    .
    .

并在onCreate之外添加bindPreferenceSummaryToValue_CheckBox

代码语言:javascript
复制
private static void bindPreferenceSummaryToValue_CheckBox(Preference preference)
{
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
    sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
            PreferenceManager
                    .getDefaultSharedPreferences(preference.getContext())
                    .getBoolean(preference.getKey(), true));
}

对于sBindPreferenceSummaryToValueListener,只需添加到扩展到AppCompatPreferenceActivity的类中

代码语言:javascript
复制
private static Preference.OnPreferenceChangeListener
        sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener()
{
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue)
    {
        //Do something on prefernce change.
        return true;
    }
};

我最近尝试了这种代码结构,如果有任何疑问,请在评论中让我知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56635769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档