2017-12-01 11 views
1

単一選択でアプリケーション言語全体を変更したい場合。1つのメニューからすべてのアクティビティの言語を変更します。

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
    private static Button english,russian; 
    private static TextView chooseText; 
    private static Locale myLocale; 

//Shared Preferences Variables 
private static final String Locale_Preference = "Locale Preference"; 
private static final String Locale_KeyValue = "Saved Locale"; 
private static SharedPreferences sharedPreferences; 
private static SharedPreferences.Editor editor; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initViews(); 
    setListeners(); 
    loadLocale(); 
} 

//Initiate all views 
private void initViews() { 
    sharedPreferences = getSharedPreferences(Locale_Preference, Activity.MODE_PRIVATE); 
    editor = sharedPreferences.edit(); 

    chooseText = (TextView) findViewById(R.id.choose_text); 
    english = (Button) findViewById(R.id.english); 
    russian = (Button) findViewById(R.id.russian); 

} 

//Set Click Listener 
private void setListeners() { 
    english.setOnClickListener(this); 
    russian.setOnClickListener(this); 

} 


@Override 
public void onClick(View view) { 
    String lang = "en";//Default Language 
    switch (view.getId()) { 
     case R.id.english: 
      lang = "en"; 
      break; 
     case R.id.russian: 
      lang = "ru"; 
      break; 

    } 

    changeLocale(lang);//Change Locale on selection basis 
} 


//Change Locale 
public void changeLocale(String lang) { 
    if (lang.equalsIgnoreCase("")) 
     return; 
    myLocale = new Locale(lang);//Set Selected Locale 
    saveLocale(lang);//Save the selected locale 
    Locale.setDefault(myLocale);//set new locale as default 
    Configuration config = new Configuration();//get Configuration 
    config.locale = myLocale;//set config locale as selected locale 
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());//Update the config 
    updateTexts();//Update texts according to locale 
} 

//Save locale method preferences 
public void saveLocale(String lang) { 
    editor.putString(Locale_KeyValue, lang); 
    editor.commit(); 
} 

//Get locale method in preferences 
public void loadLocale() { 
    String language = sharedPreferences.getString(Locale_KeyValue, ""); 
    changeLocale(language); 
} 

//Update text methods 
private void updateTexts() { 
    chooseText.setText(R.string.tap_text); 
    english.setText(R.string.btn_en); 
    russian.setText(R.string.btn_ru); 

    } 
} 

私は、コードの上に使用して単一のアクティビティの表示言語を変更することができています。しかし、私はワンクリックですべてのアプリケーション言語を変更したいと思います。これを手伝ってください。私はデバイス設定から言語アクセスを許可しようとしています。

+0

https://stackoverflow.com/questions/43292013/how-can-i-change-language-of-whole-application-by-only-single-click –

+0

https://gunhansancar.com/change-language -programmatically-in-android/ –

+1

[ワンクリックでアプリケーション全体の言語を変更するにはどうすればいいですか?](https://stackoverflow.com/questions/43292013/how-can-i-change-language-of) -whole-application-only-single-click) –

答えて

1

あなたのアプリケーションのローカリゼーションを管理するクラスLocalHelper.javaを作成します。

public class LocaleHelper { 

    private static final String SELECTED_LANGUAGE = "SELECTED_LANGUAGE"; 

    public static Context onAttach(Context context) { 
     String lang = getPersistedData(context, Locale.getDefault().getLanguage()); 
     return setLocale(context, lang); 
    } 

    public static Context onAttach(Context context, String defaultLanguage) { 
     String lang = getPersistedData(context, defaultLanguage); 
     return setLocale(context, lang); 
    } 

    public static String getLanguage(Context context) { 
     return getPersistedData(context, Locale.getDefault().getLanguage()); 
    } 

    public static Context setLocale(Context context, String language) { 
     persist(context, language); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
      return updateResources(context, language); 
     } 

     return updateResourcesLegacy(context, language); 
    } 

    private static String getPersistedData(Context context, String defaultLanguage) { 
     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
     return preferences.getString(SELECTED_LANGUAGE, defaultLanguage); 
    } 

    private static void persist(Context context, String language) { 
     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
     SharedPreferences.Editor editor = preferences.edit(); 

     editor.putString(SELECTED_LANGUAGE, language); 
     editor.apply(); 
    } 

    @TargetApi(Build.VERSION_CODES.N) 
    private static Context updateResources(Context context, String language) { 
     Locale locale = new Locale(language); 
     Locale.setDefault(locale); 

     Configuration configuration = context.getResources().getConfiguration(); 
     configuration.setLocale(locale); 
     configuration.setLayoutDirection(locale); 

     return context.createConfigurationContext(configuration); 
    } 

    @SuppressWarnings("deprecation") 
    private static Context updateResourcesLegacy(Context context, String language) { 
     Locale locale = new Locale(language); 
     Locale.setDefault(locale); 

     Resources resources = context.getResources(); 

     Configuration configuration = resources.getConfiguration(); 
     configuration.locale = locale; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      configuration.setLayoutDirection(locale); 
     } 

     resources.updateConfiguration(configuration, resources.getDisplayMetrics()); 

     return context; 
    } 
} 

そして、あなたのアプリケーションクラスでは、あなたはattachBaseContextをオーバーライドして、アプリケーションのロケール設定を初期化するためにLocaleHelper.onAttach()を呼び出す必要があります。

public class MyApplication extends Application { 
    @Override 
    protected void attachBaseContext(Context base) { 
     super.attachBaseContext(LocaleHelper.onAttach(base, "en")); 
    } 
} 

あなたの言語の変化が起こるたび、あなたはこれが他のすべての活動の変化ではなく、あなたの言語を変更する活動を行います

LocaleHelper.setLocale(this, yourNewLanguageCode); 

を呼び出す必要があります。そのアクティビティーを再作成するか、アクティビティーのビューを更新する必要があります。活動を再作成するために

startActivity(new Intent(CurrentActivity.this, CurrentActivity.class)) 
finish(); 

を呼び出して、あなたがビューを更新するのではなく活動を再作成して行きたい場合は、contextの使用を作るLocaleHelper.setLocale(this, yourNewLanguageCode)

Context context = LocaleHelper.setLocale(this, languageCode); 
Resources resources = context.getResources(); 

textView.setText(resources.getString(R.string.textTitle)); 

から注意返さ:AndroidのAPIの後をバージョン24(Nougat)では、変更を反映するためにすべてのアクティビティでattachBaseContextを上書きする必要があります。

+0

ありがとう、それは役に立ちます – Prashant

+0

これはあなたのために働く場合。受け入れられたとして答えをマークするのを忘れないでください – kcg

+0

あなたのヘルパークラスが私のために役に立ちますので+1しました。 :) – Prashant

関連する問題