Android Studio 中的 appLocale 设置

2024-02-22

我创建了广播组,用户可以在其中选择他们想要的语言,并将应用程序语言更改为所选语言,但我无法使用这些功能(不知道如何!)

我做了什么?

  1. 我做了settingsActivity
  2. 我添加了广播组
  3. 我写过setAppLocale功能
  4. 我已经设置了onRadioButtonClicked更改语言

Code

settingsActivity.java

package com.xxxxxx.xxxxx;

import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;

import android.util.DisplayMetrics;
import android.view.View;
import android.widget.RadioButton;

import java.util.Locale;

public class SettingsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings_activity);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings, new SettingsFragment())
                .commit();
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    public static class SettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
        }
    }


    //locale settings
    public void setAppLocale(String localeCode) {
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            conf.setLocale(new Locale(localeCode.toLowerCase()));
        } else {
            conf.locale = new Locale(localeCode.toLowerCase());
        }

        res.updateConfiguration(conf, dm);
    }

    // application language switch
    public void onRadioButtonClicked(View view) {
        // Is the button now checked?
        boolean checked = ((RadioButton) view).isChecked();

        // Check which radio button was clicked
        switch(view.getId()) {
            case R.id.radio_indo:
                if (checked)
                    setAppLocale("id");
                    break;
            case R.id.radio_english:
                if (checked)
                    setAppLocale("en");
                    break;
        }
    }

}

settings_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/settings">


    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginEnd="4sp"
            android:layout_marginRight="4sp"
            android:weightSum="3"
            android:gravity="center"
            android:orientation="horizontal">

        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

            <RadioGroup
                    android:id="@+id/appLang"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_marginTop="35dp"
                    android:layout_marginEnd="35dp"
                    android:layout_marginRight="35dp"
                    android:layout_marginStart="35dp"
                    android:layout_marginLeft="35dp"
                    android:orientation="horizontal">

                <TextView
                        android:id="@+id/applangtext"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="@string/applangtextstring" />

                <RadioButton
                        android:id="@+id/radio_indo"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:onClick="onRadioButtonClicked"
                        android:text="@string/indoLang" />

                <RadioButton
                        android:id="@+id/radio_english"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:onClick="onRadioButtonClicked"
                        android:text="@string/englishLang" />

            </RadioGroup>
        </LinearLayout>

    </LinearLayout>
</RelativeLayout>

Question

我需要在我的 java 文件中发生两件事:

  1. 将当前语言广播输入标记为已选择
  2. 当用户选择另一个单选按钮时进行更改

问题是我如何连接onRadioButtonClicked to setAppLocale?以及返回当前语言onCreate为了 显示当前选择的语言?

Update

基于下面的答案,这是我的最新更新和我添加的额外文件。但我的语言切换不起作用

settingsActivity.java

import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import java.util.Locale;

public class SettingsActivity extends AppCompatActivity {

    PrefManager prefManager; //added
    RadioButton radio_indo, radio_english; //added
    RadioGroup appLang; //added

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

        //added
        prefManager = new PrefManager(this);

        radio_indo = findViewById(R.id.radio_indo);
        radio_english = findViewById(R.id.radio_english);
        appLang = findViewById(R.id.appLang);

        if (prefManager.getLanguage().equals("en")) {
            radio_english.setChecked(true);
        } else {
            radio_english.setChecked(true);
        }

        // application language switch (added)
        appLang.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int checkId) {
                switch (checkId) {
                    case R.id.radio_indo:
                        prefManager.setLanguage("id");
                        // you need to restart or recreate your activity after locale change
                        break;
                    case R.id.radio_english:
                        prefManager.setLanguage("en");
                        // you need to restart or recreate your activity after locale change
                        break;
                }
            }
        });

    }

    public static class SettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
        }
    }


    //locale settings
    public void setAppLocale(String localeCode) {
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            conf.setLocale(new Locale(localeCode.toLowerCase()));
        } else {
            conf.locale = new Locale(localeCode.toLowerCase());
        }

        res.updateConfiguration(conf, dm);
    }

     // removed my old function as new function added to onCreate

}

PrefManager.java添加了类

import android.content.Context;
import android.content.SharedPreferences;

public class PrefManager {
    private SharedPreferences.Editor editor;
    private Context mContext;
    private SharedPreferences prefs;
    private final String LANGUAGE = "language";
    private final String PREF = "user_data";

    public PrefManager(Context mContext) {
        this.mContext = mContext;
    }

    public String getLanguage() {
        this.prefs = this.mContext.getSharedPreferences(PREF, 0);
        return this.prefs.getString(LANGUAGE, "en");
    }

    public void setLanguage(String language) {
        this.editor = this.mContext.getSharedPreferences(PREF, 0).edit();
        this.editor.putString(LANGUAGE, language);
        this.editor.apply();
    }
}

BaseActivity.java添加了类

import android.content.Context;

import androidx.appcompat.app.AppCompatActivity;
import java.util.Locale;

/**
 * Created by nilesh on 20/3/18.
 */

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void attachBaseContext(Context newBase) {

        Locale newLocale;

        String lang = new PrefManager(newBase).getLanguage();

        if (lang.equals("en")) {
            newLocale = new Locale("en");
        } else {
            newLocale = new Locale(lang);
        }


        Context context = ContextWrapper.wrap(newBase, newLocale);
        super.attachBaseContext(context);
    }
}

settings_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/settings">


    <RadioGroup
            android:id="@+id/appLang"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="35dp"
            android:layout_marginLeft="35dp"
            android:layout_marginTop="90dp"
            android:layout_marginEnd="35dp"
            android:layout_marginRight="35dp"
            android:gravity="center"
            android:orientation="horizontal">

        <TextView
                android:id="@+id/applangtext"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/applangtextstring" />

        <RadioButton
                android:id="@+id/radio_indo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/indoLang" />

        <RadioButton
                android:id="@+id/radio_english"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/englishLang" />

    </RadioGroup>
</RelativeLayout>

这就是我关于语言切换的全部内容。

PS-1:根据答案评论中提供的解决方案,我应该添加BaseActivity正如我所有的活动一样,但正如我所有的活动一样 是kotlin not java(除了settingsActivity)我无法 添加它。

PS-2:即使没有得到翻译是因为我无法添加 至少扩展我应该能够在我的 设置活动是java right?

知道为什么这个开关不起作用吗?


NOTE

您可以从 github repo 下载源代码 https://github.com/RathodNilesh14/LocaleChange

将当前语言广播输入标记为已选择

然后你需要将你的区域设置更改标志/状态保存在里面SharedPreferences

示例代码按着这些次序

创建一个类名PrefManager

import android.content.Context;
import android.content.SharedPreferences;

public class PrefManager {
    private SharedPreferences.Editor editor;
    private Context mContext;
    private SharedPreferences prefs;
    private final String LANGUAGE = "language";
    private final String PREF = "user_data";

    public PrefManager(Context mContext) {
        this.mContext = mContext;
    }

    public String getLanguage() {
        this.prefs = this.mContext.getSharedPreferences(PREF, 0);
        return this.prefs.getString(LANGUAGE, "en");
    }

    public void setLanguage(String language) {
        this.editor = this.mContext.getSharedPreferences(PREF, 0).edit();
        this.editor.putString(LANGUAGE, language);
        this.editor.apply();
    }
}

现在在您的中添加以下代码/条件settingsActivity.java

public class JavaActivity extends AppCompatActivity {

    PrefManager prefManager;
    RadioButton radio_indo, radio_english;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_java);
        prefManager = new PrefManager(this);
        radio_indo = findViewById(R.id.radio_indo);
        radio_english = findViewById(R.id.radio_english);

        if (prefManager.getLanguage().equals("en")) {
            radio_english.setChecked(true);
        } else {
            radio_english.setChecked(true);
        }
    }

}

当用户选择另一个单选按钮时进行更改

  • 当用户更改语言时您需要更新它SharedPreferences
  • 您需要在区域设置更改后重新启动或重新创建您的 Activity

注意:你应该使用RadioGroup.OnCheckedChangeListener()代替android:onClick="onRadioButtonClicked"

示例代码

public class JavaActivity extends AppCompatActivity {

    PrefManager prefManager;
    RadioButton radio_indo, radio_english;
    RadioGroup appLang;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_java);
        prefManager = new PrefManager(this);

        radio_indo = findViewById(R.id.radio_indo);
        radio_english = findViewById(R.id.radio_english);
        appLang = findViewById(R.id.appLang);

        if (prefManager.getLanguage().equals("en")) {
            radio_english.setChecked(true);
        } else {
            radio_english.setChecked(true);
        }

        appLang.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int checkId) {
                switch (checkId) {
                    case R.id.radio_indo:
                        prefManager.setLanguage("id");
                        // you need to restart or recreate your activity after locale change
                        break;
                    case R.id.radio_english:
                        prefManager.setLanguage("en");
                        // you need to restart or recreate your activity after locale change
                        break;
                }
            }
        });
    }

}

请按照我之前的答案更改语言环境运行时

https://stackoverflow.com/a/52270630/7666442 https://stackoverflow.com/a/52270630/7666442

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Studio 中的 appLocale 设置 的相关文章

  • SSLContext 初始化

    我正在看JSSE参考指南 我需要获取一个实例SSLContext为了创建一个SSLEngine 所以我可以使用它Netty以启用安全性 获取实例SSLContext I use SSLContext getInstance 我看到该方法被重
  • 合并和颜色样式不适用于 Apache POI excel 2003 格式

    在 Apache POI 中 我为某些单元格应用了一些样式并合并了这些单元格 当我在 2010 年或 2007 年打开时 它工作正常 但在 2003 年 格式样式消失了 每次保存 2003 Excel 文件之前都会弹出兼容性检查对话框 请参
  • 原因:打开 zip 文件时出错(android-studio)

    当我创建一个新项目时 我完成这些步骤并单击 完成 并等待项目打开 但我看到一个错误 我无法解决这个问题 我的安装和问题详细信息 我在使用以下命令将 github 项目导入 Android Studio 后遇到了这个问题File gt Imp
  • 如何在java中从包含.0的浮点数中删除小数部分

    我只想删除包含的浮点数的小数部分 0 所有其他数字都是可以接受的 例如 I P 1 0 2 2 88 0 3 56666 4 1 45 00 99 560 O P 1 2 2 88 3 567 4 1 45 99 560 有什么方法可以做到
  • Android jUnit 测试 java.lang.NoClassDefFoundError: android/database/sqlite/SQLiteOpenHelper

    我正在尝试运行一个模拟子类的单元测试SQLiteOpenHelper但我收到以下错误 java lang NoClassDefFoundError android database sqlite SQLiteOpenHelper at ja
  • 如何在 QueryDSL 中选择文字

    我目前正在开发一个使用 queryDSL 和 hibernate 的项目 其中它需要一个选择文字 按照发布的示例here https stackoverflow com questions 18691317 querydsl how to
  • Android studio 找不到 Theme.AppCompat.Light.DarkActionBar [重复]

    这个问题在这里已经有答案了 我已经导入了一个Android Studio项目来自Github into Android Studio 虽然我的build gradle有dependencies dependencies compile fi
  • Java 声音可视化器

    我正在尝试制作一个java声音可视化工具 但我完全不知道如何在实时处理音频后立即从提取的音频中获取字节 我可以将程序与 wav 文件同步 但这不是我想要做的 我想用程序生成声音 然后播放它 而不将其保存在任何地方 谢谢您的帮助 本文可以帮助
  • 不使用 length() 方法的字符串长度[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在不使用字符串的情况下找到字符串的长度length String类的方法 str toCharArray length应该管用 或者怎么
  • 如何运行传递给模拟方法的 lambda 函数?

    我想知道是否可以运行作为参数传递给模拟函数的 lambda 函数 并在调用模拟方法时运行它 我正在使用 Mockk 我想象代码是这样的 class DataManager fun submit lambda Int gt Unit val
  • 屏幕方向更改后应用程序崩溃

    我有以下问题 启动后 应用程序工作正常 即使在更改屏幕方向后也是如此 应用程序尚未准备好处理方向更改 例如替代布局等 因此仅显示旋转的默认布局就可以了 但是 当我通过按后退键离开应用程序 更改方向并在再次启动应用程序后立即崩溃 崩溃后 如果
  • Jersey 和 Spring 中的全局异常处理?

    我正在使用 Jersey 和 Spring 3 2 以及 Open CMIS 开发 RESTful Web 服务 我没有使用 Spring 的 MVC 模式 它只是 Spring IOC 和 Jersey SpringServlet 控制器
  • 自定义支持对话框片段文本颜色错误

    如果我放一个TextView在自定义对话框中 文本默认为黑色 不幸的是 支持片段对话框背景是深灰色的 灰底黑字很难读 我可以改变TextView白色或类似的东西android textColor android attr textColor
  • Java DNSLookup MX 记录列表。类似于 MXToolBox

    我正在构建一个程序来列出域的所有 MX 记录 起初似乎工作正常 但与在线工具进行比较后http mxtoolbox com http mxtoolbox com 有些域程序无法获取 MX 记录 而 MXToolbox 可以 我不确定原因是什
  • Android Lollipop:将应用程序小部件添加到主屏幕时启动器崩溃

    添加小部件时 启动器在 Android Lollipop 上崩溃 并显示以下消息 在以前的 Android 版本上运行良好 编辑 这只发生在横向方向 12 16 12 35 10 208 E AndroidRuntime 960 java
  • gwt 文本框添加更改处理程序

    我有一个从设计师那里收到的文本框 但是我在 GWT 中编写了操作 问题是文本框为空 但是当通过按下按钮用值填充文本框时 将显示警报框 通知值已更改 但没有成功 帮助我 TextBox zip1 null function onModuleL
  • 带等待/通知的同步块与不带等待/通知的同步块之间的区别?

    如果我只是使用synchronized 不是wait notify方法 它仍然是线程安全的吗 有什么不同 Using synchronized使方法 块一次只能由一个线程访问 所以 是的 它是线程安全的 这两个概念是结合在一起的 而不是相互
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 如何在ListView中标记视图?

    我有一个带有列表视图的应用程序 列表视图工作正常 当我希望列表以标记的某些行开始时 问题就开始了 如果我按下它 我可以标记一行 但是 似乎没有找到一种方法来在初始化时标记任何行 这是我的代码 listViewOfBluetooth getL
  • 需要在没有wsdl的情况下调用soap ws

    我是网络服务的新手 这个网络服务是由 siebel 提供的 我需要调用一项网络服务 我的客户向我提供了以下详细信息 这是 SOAP 对于产品 请使用它作为端点 Request

随机推荐

  • 4.1 android模拟器未检测到sd卡

    我曾经使用 4 1 kitkat x86 android 模拟器和 SD 卡进行测试 将 Android Studio 升级到 2 3 后 我无法再访问 android 中提供的 SD 卡 这使得我无法进行测试 谷歌还没有对此的答案 我也没
  • 等待所有 pid 在 php 中退出

    我的问题是这样的 我正在分叉一个进程 以便可以加快磁盘上文件的访问时间 我将这些文件中的所有数据存储在本地桌面上的 tmp 文件中 理想情况下 在所有进程完成后 我需要访问该 tmp 文件并将该数据放入数组中 然后我取消链接 tmp 文件
  • 自动化 sftp 上传过程

    我正在寻找一种将文件 目录结构从一台服务器上传到另一台服务器的方法 在我的情况下 唯一可能的方法是 SFTP 上传 有没有简单的方法来上传它 使用脚本或其他东西 而不需要对文件 目录进行存档 我想在远程服务器上重新创建 谢谢你 也许可以使用
  • 如何获取不带参数的文件名?

    我需要找到我包含的不带 GET 参数的文件的文件名 例如 如果当前 URL 是 我想要返回 file php 我发现了什么 basename SERVER REQUEST URI 返回 file php a b c d 就我而言 我在购物车
  • DataAnnotations:递归验证整个对象图

    我有一个对象图 上面散布着 DataAnnotation 属性 其中对象的某些属性是本身具有验证属性的类 等等 在以下场景中 public class Employee Required public string Name get set
  • 什么东西永远不等于自己?

    Prolog 中是否存在不等于其自身的价值 我写的answer https stackoverflow com a 53404595 10631003对某些人关于树的最小值的问题 https stackoverflow com q 5339
  • PHP如何检索数组值

    我有以下数组 我想检索name comment and each of the tags 插入数据库 我如何检索数组值 另外 我可以仅过滤大于 3 个字符且仅包含 a Z0 9 值的标签值吗 非常感谢 Array folder gt tes
  • Facebook Like 按钮以 0 宽度和 0 高度呈现?

    我是 facebook api 的新手 所以我不知道这是否是一个新手问题 我所做的是我遵循快速开始 https developers facebook com docs javascript quickstart v2 3 我将以下代码片段
  • Project Reactor:如何控制通量排放

    我有一个能发出一些光的通量Date This Date映射到我在某些设备上运行的 1024 个模拟 HTTP 请求Executer 我想做的是等待所有 1024 个 HTTP 请求 然后再发出下一个请求Date 目前运行时 onNext 被
  • 使用 xsltc.exe XslCompiledTransforms 时如何解析具有相对路径的 元素?

    作为我们的 Web 应用程序构建过程的一部分 我设置了要使用的 XSLT 样式表来构建微软的xsltc exe http msdn microsoft com en us library bb399405 aspx每当我们运行完整编译时 在
  • SwiftUI:选取器中的 ForEach 不更新

    我有一个元素数组 我想使用其中选择一个元素Picker 我有一个Button它只是将一个新元素添加到数组中 问题是 当我添加一个元素时 Picker选择未更新 它不适用于DefaultPickerStyle 但适用于SegmentedPic
  • Android studio 中的 testCompile 结果无法解决依赖关系

    我的测试位于 MainProject Project src test 中 我正在使用 Jake Wharton 的 gradle android test plugin 每当我使用 testCompile 指定依赖项时 它都不会在 IDE
  • MacVim 中的 Vim powerline (Lokaltog's) 奇怪字符

    我正在尝试使用电力线插件 https github com Lokaltog vim powerline https github com Lokaltog vim powerline 第一次 插件好像已经安装了 我通过以下命令使用 vun
  • 将python程序安全连接到mysql

    我想使用 MySQLdb 从我的 python 程序连接到 MySQL 我很担心 因为我需要将用户名和密码输入 py为了连接MySQL数据库 还要进入inno setup 没有人能找到用户名和密码并访问我的数据库吗 我该如何解决这个问题 我
  • Android 列表视图的自定义布局

    我正在使用列表视图 如下所示 String Shows new String Dexter Breaking Bad The Big Bang Theory Leverage ListView tv show list ListView v
  • SQL Server 选择不同的最新值

    我有一个包含大量行 gt 10K 的表 大多数行都有重复role与相关的值username 我想做的是按不同和最新选择行role添加者请求ID 我几乎已经拥有了 但是让我感到不安的部分是null某些值请求ID字段 因为这些请求是在添加该列之
  • Subversion 存储库工作副本结构的最佳实践?

    我刚刚开始学习如何使用 Subversion 构建我的 Web 应用程序 所以请耐心等待 以下是我的设置方法 我的域之一将托管我所有项目的存储库 我有标准的标签 分支 主干结构 它位于公共文件夹中 因此其他开发人员可以访问它 我的实时服务器
  • React 表不包含默认导出

    我想使用react table库在react中创建一个表 版本 react table 7 0 0 rc 15 当我尝试这个时 import ReactTable from react table import react table re
  • 将 .NET Guid 转换为 MongoDB ObjectID

    如何将 NET GUID 转换为 MongoDB ObjectID 在 C 中 另外 我可以将其再次从 ObjectID 转换回相同的 GUID 吗 你无法转换ObjectId into GUID反之亦然 因为它们是两个不同的东西 不同的大
  • Android Studio 中的 appLocale 设置

    我创建了广播组 用户可以在其中选择他们想要的语言 并将应用程序语言更改为所选语言 但我无法使用这些功能 不知道如何 我做了什么 我做了settingsActivity 我添加了广播组 我写过setAppLocale功能 我已经设置了onRa