0

私は、ユーザーがアプリケーションの言語を選択できるように、ListPreferenceを持つ私のアプリでPreferencesアクティビティを持っています。環境設定でリスナーを環境設定に変更する方法は?

ユーザーが[設定]操作を終了した直後に新しい言語が表示されます。

ListPreferenceにリスナーを作成して、Listenerがトリガーされたとき(ユーザーが言語を選択した直後/ ListPreferenceからアイテムを選択した後)にアプリケーションを再起動します。

どうすればいいですか?

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> 

をありがとう!

+0

mainActivityをもう一度起動し、そのonCreateメソッドで、sharedPrefsからどの言語が選択されているかを確認し、それに応じてロケールを変更してください。 – Vucko

+0

既にそれをしました。それは私が尋ねたものではありません。私はちょうどListPreferenceにリスナーを作成したい –

+0

それでは、あなたは何を求めましたか?あなたはMainActivityを開始し、他のすべてを破壊する方法を知らないのですか? 'preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener) 'を使用してください。 – Vucko

答えて

0

ここに私のプロジェクトの1つにセットアップした共有のprefs chanegリスナのための簡単なサンプルコードがあります。それはサービスのonCreateにありますが、明らかに私のアプリのどこからでも発生する私の共有されたprefsへの変更を検出することができます。

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

それをonCreateメソッドに入れるべきですか? –

+0

それは私にいくつかのエラーを与えます。 –

+0

それは動作します。正確には私が望んでいたが、それは動作する。 –