Java 如何创建一个侦听器,以在“首选项”活动中更改首选项?
我的应用程序中有Preferences活动,该活动具有ListPreference,因此用户可以为应用程序选择语言 在用户关闭“首选项”活动后,应用程序将显示新语言 我想为ListPreference创建一个监听器,这样当监听器被触发时(就在用户从ListPreference中选择语言/选择项之后),应用程序将重新启动 我该怎么做 设置活动性:Java 如何创建一个侦听器,以在“首选项”活动中更改首选项?,java,android,android-preferences,preferenceactivity,listpreference,Java,Android,Android Preferences,Preferenceactivity,Listpreference,我的应用程序中有Preferences活动,该活动具有ListPreference,因此用户可以为应用程序选择语言 在用户关闭“首选项”活动后,应用程序将显示新语言 我想为ListPreference创建一个监听器,这样当监听器被触发时(就在用户从ListPreference中选择语言/选择项之后),应用程序将重新启动 我该怎么做 设置活动性: public class SettingsActivity extends AppCompatPreferenceActivity { /** * A
public class SettingsActivity extends AppCompatPreferenceActivity {
/**
* A preference value change listener that updates the preference's summary
* to reflect its new value.
*/
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
String stringValue = value.toString();
if (preference instanceof ListPreference) {
// For list preferences, look up the correct display value in
// the preference's 'entries' list.
ListPreference listPreference = (ListPreference) preference;
int index = listPreference.findIndexOfValue(stringValue);
// Set the summary to reflect the new value.
preference.setSummary(
index >= 0
? listPreference.getEntries()[index]
: null);
} else {
// For all other preferences, set the summary to the value's
// simple string representation.
preference.setSummary(stringValue);
}
return true;
}
};
/**
* Binds a preference's summary to its value. More specifically, when the
* preference's value is changed, its summary (line of text below the
* preference title) is updated to reflect the value. The summary is also
* immediately updated upon calling this method. The exact display format is
* dependent on the type of preference.
*
* @see #sBindPreferenceSummaryToValueListener
*/
private static void bindPreferenceSummaryToValue(Preference preference) {
// Set the listener to watch for value changes.
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
// Trigger the listener immediately with the preference's
// current value.
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.getString(preference.getKey(), ""));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupActionBar();
setTitle(R.string.action_settings);
}
/**
* Set up the {@link android.app.ActionBar}, if the API is available.
*/
private void setupActionBar() {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
// Show the Up button in the action bar.
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
if (!super.onMenuItemSelected(featureId, item)) {
NavUtils.navigateUpFromSameTask(this);
}
return true;
}
return super.onMenuItemSelected(featureId, item);
}
/**
* This method stops fragment injection in malicious applications.
* Make sure to deny any unknown fragments here.
*/
protected boolean isValidFragment(String fragmentName) {
return PreferenceFragment.class.getName().equals(fragmentName)
|| GeneralPreferenceFragment.class.getName().equals(fragmentName);
}
/**
* This fragment shows general preferences only. It is used when the
* activity is showing a two-pane settings UI.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
setHasOptionsMenu(true);
// Bind the summaries of EditText/List/Dialog/Ringtone preferences
// to their values. When their values change, their summaries are
// updated to reflect the new value, per the Android Design
// guidelines.
bindPreferenceSummaryToValue(findPreference("example_text"));
bindPreferenceSummaryToValue(findPreference(getString(R.string.language_shared_pref_key)));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
getActivity().finish();
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
}
}
pref_general.xml:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:defaultValue="@string/language_code"
android:entries="@array/pref_languages_list_titles"
android:entryValues="@array/pref_languages_list_values"
android:key="@string/language_shared_pref_key"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_language" />
</PreferenceScreen>
谢谢你 以下是我在一个项目中设置的共享prefs chaneg侦听器的一些真正快速示例代码;它位于一个服务的onCreate中,但显然可以检测来自我应用程序中任何地方的对我的共享pref的更改
private SharedPreferences.OnSharedPreferenceChangeListener listener;
//Loads Shared preferences
prefs = PreferenceManager.getDefaultSharedPreferences(this);
//Setup a shared preference listener for hpwAddress and restart transport
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals(/*key for shared pref you're listening for*/) {
//Do stuff; restart activity in your case
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);
下面是我在一个项目中设置的共享prefs chaneg侦听器的一些快速示例代码;它位于一个服务的onCreate中,但显然可以检测来自我应用程序中任何地方的对我的共享pref的更改
private SharedPreferences.OnSharedPreferenceChangeListener listener;
//Loads Shared preferences
prefs = PreferenceManager.getDefaultSharedPreferences(this);
//Setup a shared preference listener for hpwAddress and restart transport
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals(/*key for shared pref you're listening for*/) {
//Do stuff; restart activity in your case
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);
只需再次启动main活动,并在其
onCreate
方法中,确保检查从sharedPrefs中选择的语言,并相应地更改区域设置。已经这样做了。我不是这么问的。我只想创建ListPreferences的侦听器那么你问了什么?您不知道如何启动主活动并销毁所有其他活动?使用preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener)
听起来您已经知道如何实现共享prefs更改侦听器;到底是什么让你绊倒了?如何创建ListPreference的侦听器,以及当它触发时,应用程序将重新启动。只需再次启动Main活动,并在其onCreate
方法中确保检查从sharedPrefs中选择的语言并相应地更改区域设置。已经这样做了。我不是这么问的。我只想创建ListPreferences的侦听器那么你问了什么?您不知道如何启动主活动并销毁所有其他活动?使用preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener)
听起来您已经知道如何实现共享prefs更改侦听器;到底是什么让你绊倒了?如何创建ListPreference的侦听器,当它触发时,应用程序将重新启动。我应该把它放在onCreate方法中吗?很高兴它对你起了作用。是的,您通常希望在主活动的onCreate中使用它,以便在更改这些值之前设置侦听器。这种行为和你想要的有什么不同,我也许能帮上忙?我应该把它放在onCreate方法中吗?很高兴它对你有帮助。是的,您通常希望在主活动的onCreate中使用它,以便在更改这些值之前设置侦听器。你的行为和你想要的有什么不同,我可以帮你吗?