내 앱 환경 설정에서 앱의 언어를 변경할 수있는 옵션이 있습니다. 나는 언어를 변경할 때환경 설정에서 새 언어가 선택되면 PreferenceFragment가 다시로드됩니다.
public class Fragment_Preferences extends PreferenceFragment {
private SharedPreferences.OnSharedPreferenceChangeListener prefListener;
SharedPreferences preferences;
@Override
public void onCreate(Bundle savedInstanceState) {
preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if(key.equals("language_preference"))
{
// Set language change flag to true -
// the Main Fragment will be recreate when this fragment finishes and the main restarts
Common_Methods.set_locale_changed(true);
}
}
};
prefs.registerOnSharedPreferenceChangeListener(prefListener);
}
}
그래서, 선호 조각은 즉시의 언어를 변경하지 않습니다.
public void onConfigurationChanged(Configuration newConfig) {
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
{
finish();
startActivity(getIntent());
} else {recreate();}
}
}, 1);
Common_Methods.set_locale_changed(false); // Reset the Language change flag to prevent repeating Fragment recreation.
super.onConfigurationChanged(newConfig);
}
내가 환경 설정을 다시 열 경우 : 나는 출구 환경 설정이 다음 내 조각 또는 활동에 나는 새로운 언어 설정과 현재의 단편이나 활동을 다시 시작이 코드를 가지고 (내가 기본 설정 조각을 요구 곳에서 따라 다름) 그 시점에서 조각 - 그것은 새로운 선택된 언어로 될 것입니다.
위의 방법을 내 Preference_Fragment에 복사하려고 시도했지만 오류가 발생했습니다. 그래서 질문은 : Preference를 먼저 빠져 나가지 않고 Preference_Fragment를 새로운 언어로 다시 만들거나 다시 불러올 수 있습니까?
나는 그것을 시도하지만, 환경 조각은 여전히 다시로드되지 않습니다. 나는 현재 PreferenceFragment를 제거하고 새로운 인스턴스로 대체하려고 시도하기도했다 : public void restartFragment() { \t \t Toast.makeText (this, "Restart called", Toast.LENGTH_SHORT) .show(); \t \t getFragmentManager(). beginTransaction(). remove (pref_frag) .commit(); \t \t pref_frag = new Fragment_Preferences(); \t getFragmentManager(). beginTransaction(). (android.R.id.content, pref_frag) replace .commit(); \t}'. Toast는 여기에서 작동했지만 다시 시작 코드에 도달했는지 확인하려고했습니다. – Igal
조각의 새로운 인스턴스를 만들어야합니다. – Florens
그래, 그렇게 생각해 보았습니다.'public void restartFragment() { \t \t Toast.makeText (this, "Restart called", Toast.LENGTH_SHORT) .show(); \t \t Fragment_Preferences new_pref_frag = new Fragment_Preferences(); \t getFragmentManager(). beginTransaction(). (android.R.id.content, new_pref_frag) .commit() 대체 \t}'결과는 동일하지만 여전히로드되지 않습니다. – Igal