2014-04-05 14 views
14

Mam dwa języki w mojej aplikacji. wartości/strings.xml i wartości-ru/strings.xml Kiedy programowo zmieniam język, wszystkie tłumaczenia są ciągłe, ale tytuł działania pozostaje niezmieniony. Używam we wszystkich działaniachKłopoty z tytułem czynności Język

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
String languageToLoad = prefs.getString("prefLanguage","en"); 
Locale locale = new Locale(languageToLoad); 
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; 
getBaseContext().getResources().updateConfiguration(config, 
     getBaseContext().getResources().getDisplayMetrics()); 

Po wybraniu języka, działanie lub aplikacja zostanie ponownie załadowana.

+1

to jest mój problem zbyt ... proszę odpowiedzieć. – ConductedClever

Odpowiedz

17

użyłem inny sposób wydaje się głupie, ale to praca

w każdej czynności spróbuj ustawić tytuł bar działania do tytułu działalności z pliku wartości

w moim przypadku używałem sherlockactionbar

więc dodałem to w oncreate mojej aktywności productdetails

getSupportActionBar().setTitle(getResources().getString(R.string.title_activity_product_details)); 
+0

wielkie dzięki za, naprawdę pomogło! –

+0

z przyjemnością pomogę :) – Tony

+1

Jeśli ustawisz tytuł jako "etykieta" aktywności w AndroidManifest.xml, możesz użyć go ponownie w ten sposób: 'int labelRes = getPackageManager(). GetActivityInfo (getComponentName(), 0) .labelRes; \t \t \t if (labelRes> 0) { \t \t \t \t getActionBar.setTitle (labelRes); \t \t \t} ' – GMan

3

wreszcie rozwiązanie:


Get resouce Id o tytule aktywność użytkownika z PackageManger i ustaw Tytuł The AcionBar do danego identyfikatora zasobów, tym razem, ponieważ Locale jest już zmieniony android wie, których aktywność tytuł odebrać.

try{ 

    ActivityInfo activityInfo = getPackageManager().getActivityInfo(getComponentName(), 
     PackageManager.GET_META_DATA); 

    ActionBar actionBar = getActionBar(); 

    if(actionBar != null) 
     actionBar.setTitle(activityInfo.labelRes); 

}catch (PackageManager.NameNotFoundException ex){ 

    Log.e(this.getClass().getSimpleName(), 
     "Error while getting activity info. " + ex.getMessage(), ex); 

} 
+1

activity.setTitle() też działa. –

+0

naprawdę? działa na ciebie również zmienić lokalizację? – dsharew

+0

Wydaje się. :) Próbowałem go z obu zmian ustawień regionalnych poprzez menu sys i zmiany ustawień regionalnych poprzez ustawienie locale w kodzie. Próbowałem na urządzeniu działającym pod kontrolą Marshmallow przy użyciu aplikacji appcompat i systheme. –

0

Zrobiłem to w następujący sposób i pracowałem dla mnie.

setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    toolbar.setTitle(resources.getString(R.string.app_name)); 
    setSupportActionBar(toolbar); 

Użyj tego kodu po zmianie lokalnej konfiguracji.

3

Dodanie setTitle(R.string.activity_title) w onCreate() aktualizuje tytuł działania, a także samą treść dotyczącą zmian ustawień narodowych w środowisku wykonawczym.

Poniżej znajduje się prosty fragment kodu, który aktualizuje swoją treść i tytuł aktywność do Korei (KO-KR) po kliknięciu przycisku:

public class MainActivity extends AppCompatActivity { 

    Button btnReset; 

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

     // Activity title will be updated after the locale has changed in Runtime 
     setTitle(R.string.app_name); 

     btnReset = (Button) findViewById(R.id.button); 
     btnReset.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Resources resources = getResources(); 
       DisplayMetrics dm = resources.getDisplayMetrics(); 
       Configuration conf = resources.getConfiguration(); 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
        conf.setLocale(Locale.KOREA); 
       } else { 
        conf.locale = Locale.KOREA; 
       } 
       resources.updateConfiguration(conf, dm); 

       // Overwrite the default Locale 
       Locale.setDefault(Locale.KOREA); 

       // Clear the back stack then restarts the activity 
       startActivity(new Intent(MainActivity.this, MainActivity.class) 
         .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
           | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK)); 
      } 
     }); 
    } 
}