2010-02-24 29 views
16

Tôi cố gắng buộc miền địa phương trong ứng dụng của tôi vào một người dùng được chỉ định. Vì điều này có thể được sử dụng để trình diễn, tôi muốn thay đổi ngôn ngữ/ngôn ngữ trong ứng dụng và không phải bất cứ lúc nào cho toàn bộ thiết bị.Android - Đặt lại ngôn ngữ cưỡng bức về các thay đổi hướng

Tôi nhìn xung quanh SO và cố gắng sử dụng mọi gợi ý tôi tìm thấy ở đây. Kết quả: Tôi có thể khởi động lại hoạt động thử nghiệm của mình bằng ngôn ngữ mới, nhưng nếu tôi thay đổi hướng, ngôn ngữ sẽ luôn được đặt lại thành thiết bị.

I uploaded a minimalistic project để bạn có thể tái tạo sự cố của mình. Vui lòng bỏ qua việc thu hẹp giao diện người dùng, điều này không quan trọng :)

Trả lời

2

Việc đặt lại ngôn ngữ có xảy ra do Hoạt động của bạn đang được khởi động lại khi thay đổi hướng không?

Nếu vậy, bạn có thể chặn hoặc ngăn chặn hướng thay đổi: Activity restart on rotation Android

+0

tôi "khởi động lại" Hoạt động của tôi với kết thúc() và startActivity() để buộc tải lại giao diện người dùng sử dụng ngôn ngữ mới.Sự thay đổi định hướng luôn đặt lại vị trí của tôi – WarrenFaith

3

Tôi chỉ thấy mã của bạn.

Kiểm tra xem Locale bạn đang sử dụng có phải là từ java.util chứ không phải từ android. Mã của bạn sẽ không thay đổi ngôn ngữ của điện thoại di động.

Để kiểm tra nó:

  • tôi đặt điện thoại của tôi để Tây Ban Nha.
  • Mở ứng dụng của bạn
  • nhấp vào nút
  • đi đến nhà
  • Icons là ở Tây Ban Nha thay vì tiếng Anh.

Nếu những gì bạn đang cố gắng làm là chỉ cần thiết lập Locale để mặc định và có thể nhìn thấy giá trị tương tự sau một xoay màn hình:

Thay vì:

android:configChanges="locale" 

sử dụng:

android:configChanges="locale|orientation" 
9

Đoạn mã này thực hiện những gì bạn cần, tôi đã thử nghiệm. Giả sử ví dụ bạn muốn người dùng có thể chuyển đổi ngôn ngữ thông qua một menu từ hoạt động chính của bạn. Bạn có thể làm điều đó thông qua tiết kiệm một lá cờ ngôn ngữ như một sở thích người dùng và kiểm tra xem nó trên "onCreate()" và "onConfigurationChanged()" như sau:

public class MainActivity extends Activity { 

SharedPreferences mPrefs1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage()); 
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics()); 

    setContentView(R.layout.activity_main); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage()); 
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics()); 
    setContentView(R.layout.activity_main); 
} 

// Declaring the Menu options 
@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{  
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_menu, menu); 
    return true; 
} 

//handle menu item selection 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch (item.getItemId()) { 
    case R.id.menu_switch_language: 
     String languageToLoad = getResources().getString(R.string.switch_language); 

     mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences.Editor editor = mPrefs1.edit(); 
     editor.putString("languagePref", languageToLoad); 
     editor.commit(); // Very important to save the preference      
     finish(); 
     startActivity(getIntent()); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

}

2

Bạn nên buộc locale của bạn trong Ứng dụng :: onCreateỨng dụng :: onConfigurationChanged. Đừng quên đăng ký lớp ứng dụng của bạn trong AndroidManifest.xml

3

gì làm việc cho tôi là thiết lập miền địa phương ngay trước khi bạn thổi phồng bố trí của bạn:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    String userLocale = "Wolof"; // adapt to your need 
    Locale locale = new Locale(userLocale); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

    setContentView(R.layout.my_activity); 

    ... 

} 
Các vấn đề liên quan