1

На странице настроек моего приложения есть два EditTextPreference (s) Когда я меняю значение, сводка должна быть обновлена. Сейчас он обновляет сводку, как только я вводим значения в EditTextPreference (s) и нажимаю OK. Но когда я перезапускаю приложение, сводка возвращается к значению по умолчанию. Но новое значение остается в EditTextPreference (я вижу, когда открываю его). Сводка снова обновляется, когда я ввожу новое значение в EditTextPreference. Как сделать сводку обновленной с пользовательского ввода каждый раз?Как обновить сводку предпочтений в android

Вот мой код:

SettingActivity.java

public class SettingsActivity extends AppCompatActivity { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Display the fragment as the main content. 
    getFragmentManager().beginTransaction() 
      .replace(android.R.id.content, new SettingsFragment()).commit(); 

    setTitle("Settings"); 
    ActionBar actionBar=getSupportActionBar(); 
    // Show the Up button in the action bar. 
    actionBar.setDisplayHomeAsUpEnabled(true); 
} 



public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Load the preferences from an XML resource 
     addPreferencesFromResource(R.xml.settings_layout); 
     setHasOptionsMenu(true); 

    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     getPreferenceScreen().getSharedPreferences() 
       .registerOnSharedPreferenceChangeListener(this); 

    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     getPreferenceScreen().getSharedPreferences() 
       .unregisterOnSharedPreferenceChangeListener(this); 

    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     Preference pref = findPreference(key); 
     if (pref instanceof EditTextPreference) { 
      EditTextPreference listPref = (EditTextPreference) pref; 
      pref.setSummary(listPref.getText()); 
     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == android.R.id.home) { 
      startActivity(new Intent(getActivity(), HomeActivity.class)); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 
} 

settings_layout.xml

<EditTextPreference 
     android:capitalize="words" 
     android:dependency="email_switch" 
     android:defaultValue="@string/default_email_address" 
     android:key="example_text" 
     android:summary="@string/pref_description_email" 
     android:maxLines="1" 
     android:selectAllOnFocus="true" 
     android:singleLine="true" 
     android:title="@string/pref_email_address_text_title" 
     android:inputType="textWebEmailAddress" /> 
<EditTextPreference 
     android:capitalize="words" 
     android:dependency="sms_switch" 
     android:defaultValue="@string/default_mobile_number" 
     android:key="example_text1" 
     android:summary="@string/pref_description_sms" 
     android:maxLines="1" 
     android:selectAllOnFocus="true" 
     android:singleLine="true" 
     android:title="@string/pref_mobile_number_text_title" 
     android:inputType="phone"/> 

P.S. Я называю это в моей основной деятельности

PreferenceManager.setDefaultValues(this, R.xml.settings_layout, false); 

ответ

1

В вашем onCreate() способе SettingsFragment класса, вам нужно получить ссылку на свой SharedPreferences, а затем запустить метод onSharedPreferenceChanged(). Ваш onCreate() должен выглядеть следующим образом:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Load the preferences from an XML resource 
    addPreferencesFromResource(R.xml.settings_layout); 
    setHasOptionsMenu(true); 

    //if you are using default SharedPreferences 
    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getContext()); 

    onSharedPreferenceChanged(sharedPrefs, getString(R.string.key1)); 
    onSharedPreferenceChanged(sharedPrefs, getString(R.string.key2)); 

} 

Где key1 и key2 ваши предпочтения ключи (example_text и example_text1 в вашем случае), сохраненный в файл strings. У меня возникла проблема, когда я делал это без ссылок на строки, поэтому я рекомендую их извлечь.

+0

Большое спасибо брату. Это сработало. :) –

+1

Sweet! Кроме того, если вы когда-либо добавляете больше предпочтений, вам нужно просто добавить еще один из этих методов для каждого из них с помощью ключевой строки. –

+0

Конечно, я это сделаю :) –