2014-09-30 2 views
0

내 앱 환경 설정에서 앱의 언어를 변경할 수있는 옵션이 있습니다. 나는 언어를 변경할 때환경 설정에서 새 언어가 선택되면 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를 새로운 언어로 다시 만들거나 다시 불러올 수 있습니까?

답변

1

조각이 업데이트되기를 바라는 액티비티를 (getActivity() 및 캐스팅을 통해) 알리고 액티비티에 논리를 추가하여 조각을 제거하고 새 인스턴스를 추가하는 것이 가장 좋습니다. 설정 활동에

:

((SettingsActivity) getActivity()).restartFragment(); 
+0

나는 그것을 시도하지만, 환경 조각은 여전히 ​​다시로드되지 않습니다. 나는 현재 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

+0

조각의 새로운 인스턴스를 만들어야합니다. – Florens

+0

그래, 그렇게 생각해 보았습니다.'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

0
Floren의 대답은, (인해 안드로이드 지원 라이브러리를 사용하여 아마) 나를 위해 작동하지 않았다

하지만 :

public void restartFragment() { 
    SettingsFragment fragment = new SettingsFragment(); 
    getFragmentManager().beginTransaction().replace(android.R.id.content, fragment).commit(); 
} 

그리고 설정 조각에

Florens의 동일한 기본 아이디어를 바탕으로 다음 솔루션으로 안내합니다. 차이는 제거 및 교체 대신 조각을 추가 :

활동에서 :

public void restartFragment() { 
    FragmentManager fm = getSupportFragmentManager(); 

    if (fragment != null) { 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.remove(fragment); 
     ft.commit(); 
    } 

    fragment = <new instance>; 

    FragmentTransaction ft = fm.beginTransaction(); 
    ft.add(R.id.fragmentActivity, main, "Main"); 
    ft.commit(); 
} 

당신의 조각에서 :

((<your activity>)getActivity()).restartFragment();