Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么EditTextPreference setText(“字符串”)只在开始时在内部工作?我试图在用户输入空字符串时设置一个值_Java_Android_Android Preferences_Android Sharedpreferences - Fatal编程技术网

Java 为什么EditTextPreference setText(“字符串”)只在开始时在内部工作?我试图在用户输入空字符串时设置一个值

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

我有我的MainActivity,它调用我的设置活动:

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; 
            }