监听首选项更改并将复选框中的布尔值传输到 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);
}
}}
我有两个问题:
- 为什么选择或取消选择复选框 Toast 不显示?
- 如何从这个 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(getApplicationContext());
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
我有 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);
}
}}
我有两个问题:
- 为什么选择或取消选择复选框 Toast 不显示?
- 如何从这个 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(getApplicationContext());
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