1
private fun setLocale(lang: String) {
        val language = Locale(lang)
        val res: Resources = resources
        val dm: DisplayMetrics = res.displayMetrics
        val conf: Configuration = res.configuration
        conf.locale = language
        res.updateConfiguration(conf, dm)
        val refresh = Intent(this, LoginActivity::class.java)
        startActivity(refresh)
        finish()
    }

大家好!

我正在创建一个 android 应用程序,这是为阿拉伯人准备的。我已经为 "en" 和 "ar" xml创建了字符串资源,并在 Mainfest.xml 中声明了它android:supportsRtl="true"

当我使用此代码转换应用程序语言时,它只转换文本。无需转换布局方向文本方向文本对齐方式

  1. 此代码包含.locale.updateConfiguration作为 java 代码。您能帮我如何清理整个代码以 适合kotlin 代码吗?
  2. 你能帮我解决 RtL 问题,使应用程序更专业和准确吗?

这是证明问题的附件。 显示了实现代码时会发生什么。 反对当我改变语言设备时

4

2 回答 2

1

要使布局更改方向遵循语言添加:

  • setLayoutDirection()从 Viewwindow.decorView

  • setLayoutDirection()从配置res.configuration

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
         res.configuration.setLayoutDirection(language)
         window.decorView.layoutDirection = if (rtl) View.LAYOUT_DIRECTION_RTL else View.LAYOUT_DIRECTION_LTR
     }
    

在上面的代码片段中,请确保替换if(rtl)为 RTL 条件,例如if (language == "ar")

您可以在活动中调用此代码onCreate(),也可以在您的setLocale()方法中对其进行测试

于 2021-10-08T21:26:02.667 回答
1

@Zain已回复我,我非常感谢他。但我开发了完全有效的答案。

@SuppressLint("ObsoleteSdkInt")
    private fun setLocale(lang: String) {
        val language = Locale(lang)
        val res: Resources = resources
        val dm: DisplayMetrics = res.displayMetrics
        val conf: Configuration = res.configuration
        conf.locale = language
        res.updateConfiguration(conf, dm)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            res.configuration.setLayoutDirection(language)
            (if (lang == "ar") {
                View.LAYOUT_DIRECTION_RTL
            } else {
                View.LAYOUT_DIRECTION_LTR
            }).also { window.decorView.layoutDirection = it }
        }
        val refresh = Intent(this, LoginActivity::class.java)
        startActivity(refresh)
        finish()
    }

所以我改变了:

  1. if表达式中我使用了lang构造函数和变量language。因为变量不会声明if为逻辑测试,所以在声明valString. 所以,正确使用构造函数。
  2. if我为所有表达式添加了大括号。
  3. 我将 assignment 转换为assignment expression
  4. 我添加了抑制注释 @SuppressLint("ObsoleteSdkInt")

老实说,我没有实施。2、3 和 4来自 Show Context Action AndroidStudio

于 2021-10-12T11:08:29.877 回答