Java 为什么EditTextPreference setText(“字符串”)只在开始时在内部工作?我试图在用户输入空字符串时设置一个值
我有我的MainActivity,它调用我的设置活动:Java 为什么EditTextPreference setText(“字符串”)只在开始时在内部工作?我试图在用户输入空字符串时设置一个值,java,android,android-preferences,android-sharedpreferences,Java,Android,Android Preferences,Android Sharedpreferences,我有我的MainActivity,它调用我的设置活动: Intent i = new Intent(this, SettingsActivity.class); startActivityForResult(i, RESULT_SETTINGS); 设备名称是EditTextPreference,没有默认值或默认值 <EditTextPreference android:key="device_name" android:title="Device Name" a
Intent i = new Intent(this, SettingsActivity.class);
startActivityForResult(i, RESULT_SETTINGS);
设备名称是EditTextPreference,没有默认值或默认值
<EditTextPreference
android:key="device_name"
android:title="Device Name"
android:selectAllOnFocus="true"
android:inputType="textCapWords"
android:capitalize="words"
android:singleLine="true"
android:maxLines="1" />
侦听器的主要焦点是设置preferences摘要,对于editTextPreference,我要检查该值是否为null或空,并将其替换为Build.MODEL
当我从MainActivity获取设置时,我使用以下代码:
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.getAppContext());
String android_id = sharedPreferences.getString("device_name", "UNKNOWN_DEVICE");
当我第一次启动应用程序时,android会像预期的那样返回未知的设备
在我打开/关闭SettingsActivity之后,android_id将按预期返回XT1060_1
如果我单击编辑设置设备名称,它也会按预期在文本字段中填充XT1060_1
问题:当我将设置设备名称编辑为空字符串,并在我的设备上单击“确定”时,设备名称的摘要按预期显示XT1060_2,日志显示:
valuesUpdate﹕ Yes
valuesUpdate﹕ Device Name = XT1060_1
所以getText在setText之后的SettingsActivity中工作得很好
但当我重新打开设备名称的设置时,文本字段仍然为空
同样,一旦我关闭SettingsActivity并尝试从MainActivity获取设置,android_id也会返回一个空字符串
一旦我再次打开SettingsActivity,它的工作原理与上面的第2点相同。onPreferenceChangedListener的onPreferenceChange方法在SharedReferences中的状态更改之前被调用。
所以
onPreferenceChange为空字符串
您在EditTextPreference上设置了新文本,我认为onPreferenceChange应该递归调用,但它似乎没有被调用
然后从1点开始应用带有空字符串的更改,即保存空字符串。
我认为在修改首选项值以防止用空字符串覆盖默认值的情况下,可以返回false
if (stringValue.trim().equals("") || stringValue.equals(null))
{
Log.i("valuesUpdate", "Yes");
editTextPreference.setText(Build.MODEL + "_1");
Log.i("valuesUpdate", editTextPreference.getTitle() + " = " + editTextPreference.getText());
editTextPreference.setSummary(Build.MODEL + "_2");
// HERE
return false;
}
valuesUpdate﹕ Yes
valuesUpdate﹕ Device Name = XT1060_1
if (stringValue.trim().equals("") || stringValue.equals(null))
{
Log.i("valuesUpdate", "Yes");
editTextPreference.setText(Build.MODEL + "_1");
Log.i("valuesUpdate", editTextPreference.getTitle() + " = " + editTextPreference.getText());
editTextPreference.setSummary(Build.MODEL + "_2");
// HERE
return false;
}