1

В следующем 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> 

enter image description here

+1

Ваш код кажется нормально. Однако я не уверен, что использование ссылки на строку (в файле ресурсов) для обозначения KEY - хорошее решение. Рассмотрим, например, случай, когда у вас есть файл с несколькими языковыми ресурсами: имя ключа изменится и сломает вашу систему. Возможно, вы можете решить свою проблему unistalling и переустановить приложение, потому что в документации говорится: «Этот метод устанавливает значения по умолчанию, только если этот метод никогда не вызывался в прошлом» – GVillani82

ответ

2

Я попытался создать новое приложение из кода, который вы указали.

Я должен был воссоздать свой файл макета, и я сделал:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="my.package.test.MainActivity"> 

    <TextView 
     android:id="@+id/mainActivity_textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    <Button 
     android:layout_below="@id/mainActivity_textView" 
     android:onClick="showCheckBoxPreferencesValue" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="CLICKME" 
     /> 
</RelativeLayout> 

(В следующий раз, пожалуйста, включите его =)!)

Я побежал код и он выглядит следующим образом:

enter image description here

Так как вы можете видеть, это работает.

Я думаю, что ваша проблема может заключаться в том, что вы запускали код более одного раза, без правильного написания ключа значения (или какого-либо другого несчастья). Вы видите, вы отправляете false как последний параметр в setDefaultValues, который заставляет его читать значения по умолчанию только (при первом запуске приложения). Попробуйте удалить приложение и переустановить его, или установите флаг в true.

То есть:

PreferenceManager.setDefaultValues(this, R.xml.preferences, true); 
+0

Большое вам спасибо за ваше время. В будущем я буду следить за тем, чтобы я опубликовал весь код. – Solace

Смежные вопросы