В следующем SSCCE идея состоит в том, что в основном действии есть кнопка, и когда пользователь нажимает на нее (используется метод showCheckBoxPreferencesValue()
) значение по умолчанию единственного предпочтения, определенного в preferences.xml (с использованием android:default_value
) должен отображаться в текстовом поле под этой кнопкой.Почему defaultValue моих предпочтений не сохраняется в SharedPreferences?
Для того, чтобы получить это значение по умолчанию для отображения в текстовом поле, я использую метод sharedPreferences.getString()
и передать Preference does not exist
в качестве второго аргумента, что означает, если предпочтение (с key
передается в качестве первого аргумента), кажется, не существует, то строка Preference does not exist
установлена в текстовое поле. (Source)
И что происходит? Что я делаю не так? Смотрите снимок экрана в конце.
разреш/XML/preferences.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<EditTextPreference android:key="@string/preferences_editTextPreference_key"
android:title="@+id/preferences_editTextPreference_title"
android:defaultValue="@string/preferences_editTextPreference_defaultValue" />
</PreferenceScreen>
MainActivity.java:
public class MainActivity extends Activity {
private String EDIT_TEXT_PREFERENCE_KEY;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.mainActivity_textView);
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
}
public void showCheckBoxPreferencesValue(View view) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
EDIT_TEXT_PREFERENCE_KEY = getResources().getString(R.string.preferences_editTextPreference_key);
String editTextPreferenceValue = sharedPreferences.getString(EDIT_TEXT_PREFERENCE_KEY,
"Preference does not exist");
textView.setText("Checkbox Preference Value: " + editTextPreferenceValue);
}
}
разреш/значения/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Preferences Practice</string>
<string name="mainActivity_button">Show EditText Preference\'s Value</string>
<string name="preferences_editTextPreference_key">EditTextPreferenceKey</string>
<string name="preferences_editTextPreference_title">EditTextPreference Title</string>
<string name="preferences_editTextPreference_defaultValue">EditTextPreference Default Value String</string>
</resources>
Ваш код кажется нормально. Однако я не уверен, что использование ссылки на строку (в файле ресурсов) для обозначения KEY - хорошее решение. Рассмотрим, например, случай, когда у вас есть файл с несколькими языковыми ресурсами: имя ключа изменится и сломает вашу систему. Возможно, вы можете решить свою проблему unistalling и переустановить приложение, потому что в документации говорится: «Этот метод устанавливает значения по умолчанию, только если этот метод никогда не вызывался в прошлом» – GVillani82