You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio(Kotlin)中如何在一个类中调用另一个类的函数?

我来帮你搞定这个语言偏好设置的问题!下面是完整的实现方案,一步步帮你把需求落地:

语言偏好设置完整实现指南

1. 补全你的Preferences类

首先把你没写完的Preferences类补全,确保它能正确读写SharedPreferences里的语言配置:

class Preferences(context: Context) {
    private val PREFS_FILENAME = "artour.prefs"
    private val LANGUAGE = "language"
    private val prefs: SharedPreferences = context.getSharedPreferences(PREFS_FILENAME, Context.MODE_PRIVATE)

    // 获取当前语言偏好,默认返回英语"en"
    fun getLanguage(): String? {
        return prefs.getString(LANGUAGE, "en")
    }

    // 保存用户选择的语言偏好
    fun setLanguage(language: String) {
        val editor = prefs.edit()
        editor.putString(LANGUAGE, language)
        editor.apply() // 异步提交更高效,不需要返回结果的话优先用这个
    }
}

2. 在Language Activity中调用setter方法

假设你的Language Activity里有语言选择控件(比如RadioGroup、Spinner),选中后直接调用Preferences的setLanguage方法即可。这里以RadioGroup为例给你写个示例:

class LanguageActivity : AppCompatActivity() {
    private lateinit var preferences: Preferences

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_language)

        // 初始化Preferences实例,建议用applicationContext避免内存泄漏
        preferences = Preferences(applicationContext)

        // 绑定语言选择的RadioGroup
        val languageRadioGroup = findViewById<RadioGroup>(R.id.language_radio_group)
        
        // 恢复之前保存的语言选中状态(可选优化)
        val currentLang = preferences.getLanguage()
        when(currentLang) {
            "en" -> languageRadioGroup.check(R.id.radio_en)
            "zh" -> languageRadioGroup.check(R.id.radio_zh)
            // 可添加更多语言选项的映射
            else -> languageRadioGroup.check(R.id.radio_en)
        }

        // 监听用户的语言选择操作
        languageRadioGroup.setOnCheckedChangeListener { _, checkedId ->
            val selectedLang = when(checkedId) {
                R.id.radio_en -> "en"
                R.id.radio_zh -> "zh"
                // 对应其他语言选项的取值
                else -> "en"
            }
            // 调用setter保存用户选择
            preferences.setLanguage(selectedLang)
            
            // 提示用户语言已设置,建议重启应用/当前页面生效
            Toast.makeText(this, "语言已更新,重启应用后生效", Toast.LENGTH_SHORT).show()
            
            // 如果想立即生效,可以直接重建当前Activity
            // recreate()
        }
    }
}

3. 额外关键提示

仅仅保存语言偏好还不够,要让应用真正切换语言,你需要在全局配置语言:
可以写一个工具方法,在Application或BaseActivity中读取偏好并设置Locale:

private fun setAppLocale(context: Context, language: String): Context {
    val locale = Locale(language)
    Locale.setDefault(locale)
    val config = context.resources.configuration
    config.setLocale(locale)
    return context.createConfigurationContext(config)
}

然后在BaseActivity的attachBaseContext方法中调用:

override fun attachBaseContext(newBase: Context) {
    val preferences = Preferences(newBase)
    val targetLang = preferences.getLanguage() ?: "en"
    super.attachBaseContext(setAppLocale(newBase, targetLang))
}

内容的提问来源于stack exchange,提问作者Lassley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:54:09