监听首选项更改并将复选框中的布尔值传输到 MainActivity

Listen preference change and transfer boolean in checkbox to MainActivity

我有 2 个文件:

control_preferences.xml:`

<PreferenceCategory
    android:title="@string/control_category">


    <CheckBoxPreference
        android:title="Debug Information ON/OFF"
        android:defaultValue="false"
        android:summary="Show debug information when ON"
        android:key="checkboxPref" />

</PreferenceCategory>

`

SettingsActivity.java:

package com.sample;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;



public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {


    public static final String KEY_PREF_DEBUG = "checkboxPref";



    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                                          String key) {
        if (key.equals(KEY_PREF_DEBUG)) {
            Toast.makeText(getApplicationContext(), "CLICK",
                    Toast.LENGTH_SHORT).show();
        }
    }





    @Override
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.preference_headers, target);
    }


    public static class ControlPrefsFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // load the preferences from an XML resource
            addPreferencesFromResource(R.xml.fragmented_control_preferences);
        }
    }}

我有两个问题:

  1. 为什么选择或取消选择复选框 Toast 不显示?
  2. 如何从这个 CheckBox 存储在 SharedPreferences 布尔值中,然后在 MainActivity 中读取这个布尔值。

1) 为什么选中或取消选中复选框 Toast 不显示?

在您的 activity

简历中添加以下行
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.registerOnSharedPreferenceChangeListener(prefs);

2)如何从这个 CheckBox 中存储到 SharedPreferences 布尔值,然后在 MainActivity 中读取这个布尔值? 使用以下代码获取值

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.getBoolean("key_value_given_in_preference_xml_file") 

使用这个而不是实现接口

checkboxPref = (CheckBoxPreference) getPreferenceScreen().findPreference(your_key);

checkboxPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() 
{

     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) 
     {

          YOUR CODE                    

          return false;
     }
});

@Jawegiel

我把这个插入到:

public static class ControlPrefsFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // load the preferences from an XML resource
            addPreferencesFromResource(R.xml.fragmented_control_preferences);

            final CheckBoxPreference checkboxPref = (CheckBoxPreference) getPreferenceManager().findPreference("checkboxPref");


            checkboxPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener()
            {

                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue)
                {

                    Toast.makeText(getActivity().getApplicationContext(), "CLICK",
                            Toast.LENGTH_SHORT).show();

                    return false;
                }
            });
        }
    }

而且有效:)

谢谢你们:)

@Jawegiel

如果我像 "Debug: " + "boolean from this actually changed checkbox" 这样使用 Toast 会怎么样?在 MainActivity 中,我通过代码读取了这个布尔值:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplication‌​Context());
 boolean check = prefs.getBoolean("checkboxPref",false);

如何像在 MainActivity 中一样在 SettingsActivity 中读取这个布尔值?

我尝试通过这段代码:

checkboxPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener()
            {

                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue)
                {
                    boolean check = checkboxPref.getSharedPreferences().getBoolean("checkboxPref",false);
                    Toast.makeText(getActivity().getApplicationContext(), "Debug " + check,
                            Toast.LENGTH_SHORT).show();

                    return false;
                }
            });

但现在我无法取消选中 Checkbox 或单击 if false :d