2016-08-23 2 views
0

http://i.stack.imgur.com/vnfQt.pngWenn ich Wert in Gemeinschafts-Preference App ändern bekam Absturz

Wie oben Aus Einstellungen angezeigt, wenn ich den Wert von temprature Einheiten von metrischen in einem britischen und Zurück-Taste drücke meine app Absturz bekam ändern und

unten Fehler zeigen

http://i.stack.imgur.com/dBeHk.png

SettingsActivity

package com.example.poo.sunshine; 

    import android.app.Activity; 
    import android.content.SharedPreferences; 
    import android.os.Bundle; 
    import android.preference.ListPreference; 
    import android.preference.Preference; 
    import android.preference.PreferenceFragment; 
    import android.preference.PreferenceManager; 

    public class SettingsActivity extends Activity { 

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

     // Display the fragment as the main content. 
     getFragmentManager().beginTransaction() 
       .replace(R.id.container, new MyPreferenceFragment()) 
       .commit(); 
    } 

    public static class MyPreferenceFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      // Add 'general' preferences, defined in the XML file 
      addPreferencesFromResource(R.xml.pref_general); 

      // For all preferences, attach an OnPreferenceChangeListener so the UI summary can be 
      // updated when the preference changes. 
      PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(this); 

     } 

     @Override 
     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
      Preference locationPref = findPreference(getString(R.string.pref_location_key)); 
      Preference unitsPref = findPreference(getString(R.string.pref_units_key)); 
      prefChanged(sharedPreferences, locationPref, key); 
      prefChanged(sharedPreferences, unitsPref, key); 
     } 

     private void prefChanged(SharedPreferences sharedPreferences, Preference pref, String key) { 
      if (sharedPreferences instanceof ListPreference) { 
       // For list preferences, look up the correct display value in 
       // the preference's 'entries' list (since they have separate labels/values). 
       ListPreference listPreference = (ListPreference) sharedPreferences; 
       int prefIndex = listPreference.findIndexOfValue(key); 
       if (prefIndex >= 0) { 
        pref.setSummary(listPreference.getEntries()[prefIndex]); 
       } else { 
        pref.setSummary(sharedPreferences.getString(key, "")); 
       }  
      }  
     } 
    } 
} 
+0

Ich vermute, das Problem ist, dass Ihr Fragment nicht mehr zur Aktivität hinzugefügt wird. Sie können mit der Methode 'isAdded()' überprüfen, wenn es vor der Verwendung der Einstellungen ist: https://developer.android.com/reference/android/app/Fragment.html#isAdded%28%29 – Opiatefuchs

+0

ya sure ok lassen Sie mich überprüfen Sie –

Antwort

0

Das Problem ist Ursache aus der Sicht Ihres Fragment ist noch nicht an Ihre SettingActivity angehängt.

Um diesen Fehler zu vermeiden, können Sie vor Zugriffssichten in Ihrem Fragment mit isAdded() überprüfen.

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     if(isAdded()){ 
      Preference locationPref = findPreference(getString(R.string.pref_location_key)); 
      Preference unitsPref = findPreference(getString(R.string.pref_units_key)); 
      prefChanged(sharedPreferences, locationPref, key); 
      prefChanged(sharedPreferences, unitsPref, key); 
     } 

} 

Eine andere Lösung und ich möchte auch vorschlagen. Sie sollten den bevorzugten Listener in onViewCreated() in Ihrem Fragment registrieren. Das bedeutet, dass dein Fragment vollständig angehängt ist.

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     PreferenceManager.getDefaultSharedPreferences(getActivity()) 
     .registerOnSharedPreferenceChangeListener(this); 
} 

Hoffe, das wird funktionieren!

+0

lassen Sie mich versuchen ... Danke für die Beantwortung meiner Frage –

+0

muss ich beide Dinge hinzufügen ?? isAdded() -Methode und registrieren Sie die Präferenzänderung? –

+0

Nur eine dieser Lösungen :) aber ich denke, meine vorgeschlagene Lösung ist besser. –

Verwandte Themen