0

Ich habe Einstellungen Aktivität in meiner App, die ListPreference hat, so dass der Benutzer Sprache für die App wählen kann.Wie erstelle ich einen Listener zu Einstellungen ändert sich in Einstellungen Aktivität?

Die App zeigt die neue Sprache an, unmittelbar nachdem der Benutzer die Einstellungen schließt.

Ich möchte einen Listener für die ListPreference erstellen, damit die App neu gestartet wird, wenn der Listener ausgelöst wird (direkt nachdem der Benutzer eine Sprache ausgewählt hat/aus der ListPreference auswählt).

Wie kann ich das tun?

SettingsActivity:

public class SettingsActivity extends AppCompatPreferenceActivity { 
/** 
* A preference value change listener that updates the preference's summary 
* to reflect its new value. 
*/ 
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object value) { 
     String stringValue = value.toString(); 

     if (preference instanceof ListPreference) { 
      // For list preferences, look up the correct display value in 
      // the preference's 'entries' list. 
      ListPreference listPreference = (ListPreference) preference; 
      int index = listPreference.findIndexOfValue(stringValue); 

      // Set the summary to reflect the new value. 
      preference.setSummary(
        index >= 0 
          ? listPreference.getEntries()[index] 
          : null); 

     } else { 
      // For all other preferences, set the summary to the value's 
      // simple string representation. 
      preference.setSummary(stringValue); 
     } 
     return true; 
    } 
}; 


/** 
* Binds a preference's summary to its value. More specifically, when the 
* preference's value is changed, its summary (line of text below the 
* preference title) is updated to reflect the value. The summary is also 
* immediately updated upon calling this method. The exact display format is 
* dependent on the type of preference. 
* 
* @see #sBindPreferenceSummaryToValueListener 
*/ 
private static void bindPreferenceSummaryToValue(Preference preference) { 
    // Set the listener to watch for value changes. 
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); 

    // Trigger the listener immediately with the preference's 
    // current value. 
    sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, 
      PreferenceManager 
        .getDefaultSharedPreferences(preference.getContext()) 
        .getString(preference.getKey(), "")); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setupActionBar(); 
    setTitle(R.string.action_settings); 
} 

/** 
* Set up the {@link android.app.ActionBar}, if the API is available. 
*/ 
private void setupActionBar() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (actionBar != null) { 
     // Show the Up button in the action bar. 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    int id = item.getItemId(); 
    if (id == android.R.id.home) { 
     if (!super.onMenuItemSelected(featureId, item)) { 
      NavUtils.navigateUpFromSameTask(this); 
     } 
     return true; 
    } 
    return super.onMenuItemSelected(featureId, item); 
} 

/** 
* This method stops fragment injection in malicious applications. 
* Make sure to deny any unknown fragments here. 
*/ 
protected boolean isValidFragment(String fragmentName) { 
    return PreferenceFragment.class.getName().equals(fragmentName) 
      || GeneralPreferenceFragment.class.getName().equals(fragmentName); 
} 

/** 
* This fragment shows general preferences only. It is used when the 
* activity is showing a two-pane settings UI. 
*/ 
@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public static class GeneralPreferenceFragment extends PreferenceFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.pref_general); 
     setHasOptionsMenu(true); 

     // Bind the summaries of EditText/List/Dialog/Ringtone preferences 
     // to their values. When their values change, their summaries are 
     // updated to reflect the new value, per the Android Design 
     // guidelines. 
     bindPreferenceSummaryToValue(findPreference("example_text")); 
     bindPreferenceSummaryToValue(findPreference(getString(R.string.language_shared_pref_key))); 
    } 

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

}

pref_general.xml:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

<ListPreference 
    android:defaultValue="@string/language_code" 
    android:entries="@array/pref_languages_list_titles" 
    android:entryValues="@array/pref_languages_list_values" 
    android:key="@string/language_shared_pref_key" 
    android:negativeButtonText="@null" 
    android:positiveButtonText="@null" 
    android:title="@string/pref_title_language" /> 

</PreferenceScreen> 

Thank you !!!

+0

Starten Sie einfach die mainActivity erneut und überprüfen Sie in der 'onCreate' Methode, welche Sprache aus sharedPrefs ausgewählt ist und ändern Sie das Gebietsschema entsprechend. – Vucko

+0

Schon getan. Das habe ich nicht gefragt. Ich möchte nur Listener zur ListPreference –

+0

erstellen Nun, was hast du dann gefragt? Sie wissen nicht, wie Sie die MainActivity starten und alle anderen zerstören sollen? Verwende 'preference.setOnPreferenceChangeListener (sBindPreferenceSummaryToValueListener)' – Vucko

Antwort

0

Hier ist ein kurzer Beispielcode für einen gemeinsamen Prefs Chaneg Listener, den ich in einem meiner Projekte eingerichtet habe; Es befindet sich im OnCreate eines Dienstes, kann aber offensichtlich Änderungen an meinen gemeinsamen Einstellungen erkennen, die von überall in meiner App stammen.

private SharedPreferences.OnSharedPreferenceChangeListener listener; 


//Loads Shared preferences 
prefs = PreferenceManager.getDefaultSharedPreferences(this); 

//Setup a shared preference listener for hpwAddress and restart transport 
listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
      public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
      if (key.equals(/*key for shared pref you're listening for*/) { 
       //Do stuff; restart activity in your case 
      } 
     }; 

prefs.registerOnSharedPreferenceChangeListener(listener); 
+0

Soll ich das in OnCreate-Methode setzen? –

+0

Das gibt mir einige Fehler. –

+0

Es funktioniert. Nicht so, wie ich es wollte, aber es funktioniert. –