1. 程式人生 > >App多語言切換實現

App多語言切換實現

先看下效果:
這裡寫圖片描述

1、在res目錄下新建values-en目錄,在此目錄下新建string.xml檔案,內容如下:

<resources>
    <string name="complete_info">complete information</string>
    <string name="account_query">account query</string>
    <string name="about_us">about us</string>
    <string name
="system_setting">system setting</string> <string name="log_out">log out</string> <string name="change_language">change language</string> </resources>

在預設的values檔案下string.xml檔案有對應的中文:

<resources>
    <string name="complete_info">完善資訊</string
> <string name="account_query">賬戶查詢</string> <string name="about_us">關於我們</string> <string name="system_setting">系統設定</string> <string name="log_out">退出登入</string> <string name="change_language">切換語言</string> </resources>

2、切換語言工具類:

public class ChangeLanguageHelper {

    /**
     * 說明:
     * 1、context.getResources().getConfiguration()獲取的是本應用內部的語言和地區設定的Configuration
     * 2、Resources.getSystem().getConfiguration()獲取的是系統的語言和地區設定的Configuration
     */
    public static void changeAppLanguage(Context context, int language) {
        Resources resources = context.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        Configuration config = resources.getConfiguration();
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
            config.setLocale(getLocale(language));
        } else {
            config.locale = getLocale(language);
        }
        resources.updateConfiguration(config, dm);
        SPUtil.getInstance().setAppLanguage(language);
    }

    private static Locale getLocale(int language){
        //預設是系統的語言設定
        Locale locale = Resources.getSystem().getConfiguration().locale;
        if (language == Constant.SIMPLE_CHINESE) {//簡體中文
            locale = Locale.SIMPLIFIED_CHINESE;
        }
        if (language == Constant.ENGLISH) {//英文
            locale = Locale.ENGLISH;
        }
        return locale;
    }

}

3、切換語言程式碼:

public class SelectLanguageActivity extends BaseActivity {

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

        setClick();
    }

    private void setClick() {
        findViewById(R.id.auto_tv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ChangeLanguageHelper.changeAppLanguage(mContext, Constant.LANGUAGE_DEFAULT);
                RestartApp();
            }
        });

        findViewById(R.id.chinese_tv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ChangeLanguageHelper.changeAppLanguage(mContext, Constant.SIMPLE_CHINESE);
                RestartApp();
            }
        });

        findViewById(R.id.english_tv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ChangeLanguageHelper.changeAppLanguage(mContext, Constant.ENGLISH);
                RestartApp();
            }
        });
    }

    private void RestartApp() {
        Intent intent = new Intent(this, MainActivity.class);
        //開始新的activity同時移除之前所有的activity
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
        finish();
    }
}

4、Activity的基類:

public abstract class BaseActivity extends AppCompatActivity{

    protected Context mContext;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        //保證app程序殺死後再次啟動時,之前的語言設定有效
        ChangeLanguageHelper.changeAppLanguage(mContext, SPUtil.getInstance().getAppLanguage());
    }
}

常量類:

public class Constant {

    public static final int LANGUAGE_DEFAULT = 0; //自動
    public static final int SIMPLE_CHINESE = 1; //中文
    public static final int ENGLISH = 2; //英文

}