Java 将“编辑文本首选项标题”设置为“编辑文本首选项标题”;“好的”;点击
当用户在框中输入值时,我使用此代码应用editTextPreference标题。 问题是,当我单击“确定”时,它不会更改标题,但只有当我重新单击editTextPreference时,它才会应用写入前的值Java 将“编辑文本首选项标题”设置为“编辑文本首选项标题”;“好的”;点击,java,android,android-fragments,sharedpreferences,Java,Android,Android Fragments,Sharedpreferences,当用户在框中输入值时,我使用此代码应用editTextPreference标题。 问题是,当我单击“确定”时,它不会更改标题,但只有当我重新单击editTextPreference时,它才会应用写入前的值 public void handleTEST(){ final EditTextPreference pref = (EditTextPreference)findPreference("test"); pref.setOnPreferenceClickListene
public void handleTEST(){
final EditTextPreference pref = (EditTextPreference)findPreference("test");
pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener(){
@Override
public boolean onPreferenceClick(Preference preference) {
pref.setTitle(pref.getText());
return true;
}
});
}
那么我如何在“确定”点击时应用标题呢?与问题匹配的简短答案:
public class SomePrefenceScreen extends PreferenceFragment implements
OnSharedPreferenceChangeListener {
private EditTextPreference edittext;
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getActivity();
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.your_settings_xml);
edittext = (EditTextPreference) getPreferenceScreen().findPreference("test");
}
@Override
public void onStart() {
updateAll();
super.onStart();
}
@Override
public void onResume() {
PreferenceManager.getDefaultSharedPreferences(context)
.registerOnSharedPreferenceChangeListener(this);
super.onResume();
}
@Override
public void onPause() {
PreferenceManager.getDefaultSharedPreferences(context)
.unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
updateAll();
}
private void updateAll() {
SharedPreferences sharedPrefs = PreferenceManager
.getDefaultSharedPreferences(context);
// test_key being the android:key defined in XML in your_settings_xml
String titleString = sharedPrefs.getString("test_key", "");
if (!titleString.isEmpty()) {
edittext.setTitle(titleString);
}
}
}
public class GoogleMapsSettings extends DaggerPreferenceFragment implements
OnSharedPreferenceChangeListener {
private static final String TAG = "GoogleMapsSetings";
private StatusCheck statusCheck;
private ListPreference address_entry;
private ListPreference city_entry;
@Inject @ForActivity Context context;
@Inject Preferences preferences;
@Inject GoogleMapsModule googleMapsModule;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.settings_module_googlemaps);
address_entry = (ListPreference) getPreferenceScreen().findPreference(
getString(R.string.key_googlemaps_address_entry));
city_entry = (ListPreference) getPreferenceScreen().findPreference(
getString(R.string.key_googlemaps_city_entry));
}
@Override public void onStart() {
updateAllSummaries();
statusCheck = new StatusCheck(context, googleMapsModule, this);
statusCheck.runCheck();
super.onStart();
}
@Override public void onResume() {
PreferenceManager.getDefaultSharedPreferences(context)
.registerOnSharedPreferenceChangeListener(this);
super.onResume();
}
@Override public void onPause() {
PreferenceManager.getDefaultSharedPreferences(context)
.unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
@Override public void onSharedPreferenceChanged(SharedPreferences prefs,
String key) {
if (key.equals(getString(R.string.key_module_activated_googlemaps))) {
statusCheck.runCheck();
}
updateAllSummaries();
}
private void updateAllSummaries() {
SummaryUpdater.updateEntry(this, preferences,
R.string.key_googlemaps_address_entry,
R.string.prefs_setting_summary_address);
SummaryUpdater.updateEntry(this, preferences,
R.string.key_googlemaps_city_entry,
R.string.prefs_setting_summary_city);
}
长答案和更通用的辅助类方法:
public class SomePrefenceScreen extends PreferenceFragment implements
OnSharedPreferenceChangeListener {
private EditTextPreference edittext;
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getActivity();
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.your_settings_xml);
edittext = (EditTextPreference) getPreferenceScreen().findPreference("test");
}
@Override
public void onStart() {
updateAll();
super.onStart();
}
@Override
public void onResume() {
PreferenceManager.getDefaultSharedPreferences(context)
.registerOnSharedPreferenceChangeListener(this);
super.onResume();
}
@Override
public void onPause() {
PreferenceManager.getDefaultSharedPreferences(context)
.unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
updateAll();
}
private void updateAll() {
SharedPreferences sharedPrefs = PreferenceManager
.getDefaultSharedPreferences(context);
// test_key being the android:key defined in XML in your_settings_xml
String titleString = sharedPrefs.getString("test_key", "");
if (!titleString.isEmpty()) {
edittext.setTitle(titleString);
}
}
}
public class GoogleMapsSettings extends DaggerPreferenceFragment implements
OnSharedPreferenceChangeListener {
private static final String TAG = "GoogleMapsSetings";
private StatusCheck statusCheck;
private ListPreference address_entry;
private ListPreference city_entry;
@Inject @ForActivity Context context;
@Inject Preferences preferences;
@Inject GoogleMapsModule googleMapsModule;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.settings_module_googlemaps);
address_entry = (ListPreference) getPreferenceScreen().findPreference(
getString(R.string.key_googlemaps_address_entry));
city_entry = (ListPreference) getPreferenceScreen().findPreference(
getString(R.string.key_googlemaps_city_entry));
}
@Override public void onStart() {
updateAllSummaries();
statusCheck = new StatusCheck(context, googleMapsModule, this);
statusCheck.runCheck();
super.onStart();
}
@Override public void onResume() {
PreferenceManager.getDefaultSharedPreferences(context)
.registerOnSharedPreferenceChangeListener(this);
super.onResume();
}
@Override public void onPause() {
PreferenceManager.getDefaultSharedPreferences(context)
.unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
@Override public void onSharedPreferenceChanged(SharedPreferences prefs,
String key) {
if (key.equals(getString(R.string.key_module_activated_googlemaps))) {
statusCheck.runCheck();
}
updateAllSummaries();
}
private void updateAllSummaries() {
SummaryUpdater.updateEntry(this, preferences,
R.string.key_googlemaps_address_entry,
R.string.prefs_setting_summary_address);
SummaryUpdater.updateEntry(this, preferences,
R.string.key_googlemaps_city_entry,
R.string.prefs_setting_summary_city);
}
SummaryUpdater只是一个帮助类,用于更新相关文本,这有助于减少代码冗余:
public class SummaryUpdater {
public static void updateString(PreferenceFragment pref,
Preferences preferences, int resource) {
updateString(pref, preferences, resource, "");
}
public static void updateString(PreferenceFragment pref,
Preferences preferences, int resource, String postfix) {
Preference preference = (Preference) pref.findPreference(pref
.getString(resource));
if (preference != null) {
String summaryString = preferences.getString(resource);
summaryString = (postfix.isEmpty()) ? summaryString : summaryString
+ " " + postfix;
if (!summaryString.isEmpty()) {
preference.setSummary(summaryString);
}
}
}
public static void updateEntry(PreferenceFragment pref,
Preferences preferences, int resourcekey, int resourcedefault) {
Preference preference = pref
.findPreference(pref.getString(resourcekey));
if (preference != null) {
int currentEntry = Integer.parseInt(preferences
.getString(resourcekey));
if (currentEntry != 0) {
preference.setSummary(pref.getString(R.string.entry) + ": "
+ currentEntry);
} else {
preference.setSummary(pref.getString(resourcedefault));
}
}
}
public static void updateInt(PreferenceFragment pref,
Preferences preferences, int resource) {
updateInt(pref, preferences, resource, "");
}
public static void updateInt(PreferenceFragment pref,
Preferences preferences, int resource, String postfix) {
Preference preference = (Preference) pref.findPreference(pref
.getString(resource));
if (preference != null) {
String summaryString = "" + preferences.getStringInt(resource);
summaryString = (postfix.isEmpty()) ? summaryString : summaryString
+ " " + postfix;
preference.setSummary(summaryString);
}
}
}
Preferences对象仅访问SharedReferences的读/写,例如下面是获取/设置字符串值:
public void putString(int resource, String value) {
String key = context.getString(resource);
boolean success = sharedPrefs.edit().putString(key, value).commit();
}
public String getString(int resource) {
String key = context.getString(resource);
if (sharedPrefs != null && context.getString(resource) != null) {
return sharedPrefs.getString(key, "");
}
return "";
}
据我所知,您只想在该特定首选项的标题中显示存储在preference中的值。所以试试这个:
public void handleTEST(){
final EditTextPreference pref = (EditTextPreference) findPreference("test");
pref.setTitle(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("test", "Default Title"));
// Loads the title for the first time
// Listens for change in value, and then changes the title if required.
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
pref.setText(newValue.toString());
return false;
}
});
}
希望这有帮助:)这是我读到的。更改共享首选项值的值时,是否希望首选项活动/片段中显示的文本相应更新?否则,请使用问题中的代码发布完整的类,以便为您想要的内容添加更多的上下文。我写道,当我单击“确定”按钮时,我想用输入值来设置edittextpreference标题。这是我的代码所做的,只是它更改摘要而不是标题,但这个想法是有效的。方法是在onSharedPreferenceChanged中捕获首选项值的更改,而不是处理每个PreferenceView的单击。如果您发布包含handleTEST()的完整类代码,我将尝试为您实现它。@cYrixmorten您的答案没有达到这一点,这就是它看起来无效的原因。请将其缩短为所需的代码段。这可能会有所帮助:只需将其从“单击侦听器”更改为“更改侦听器”。不,如果我单击“确定”按钮,则不会应用标题,但仅当我重新单击“编辑文本”时才适用。有一种方法类似于“onPositiveButtonClick”?当值更改时,将调用方法onPreferenceChange()。请稍等,如果您仍然无法回答,我将发布一个答案。我已更新了我的答案,以包含答案的较短版本。此答案正确、简单且切中要害,但我只需要指出,在多个不同设置下,这将产生多少冗余代码。因此,如果您需要在多个设置中使用此选项,我建议您在每个设置页面上使用一个共享首选项ChangeListener的解决方案,正如我在回答中尝试演示的那样。我同意,如果使用匿名内部类,则代码不能重复使用。所以,我只会使用一个匿名类,如果我绝对肯定我不会在任何地方再次使用它。谢谢你指出这一点。:)