Android Studio中的appLocale设置 [英] appLocale setting in android studio

查看:76
本文介绍了Android Studio中的appLocale设置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经建立了无线电组,用户可以在其中选择所需的语言,并将应用程序语言更改为所选语言,但是我无法使用功能(不确定如何操作!)

I have made radio group where user can select their desire language and app language changes to selected language but i am not able to use the functions (not sure how to!)

  1. 我已经完成了 settingsActivity
  2. 我已经添加了广播组
  3. 我写了 setAppLocale 函数
  4. 我已将 onRadioButtonClicked 设置为更改语言
  1. I've made settingsActivity
  2. I've added radio group
  3. I've wrote setAppLocale function
  4. I've set onRadioButtonClicked to change languages

代码

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>

问题

我需要在Java文件中进行两件事:

Question

I need to make 2 things happen in my java file:

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

问题是如何将 onRadioButtonClicked 连接到 setAppLocale ?并按顺序返回当前语言 onCreate 显示当前选择的语言?

The question is how do I connect onRadioButtonClicked to setAppLocale? as well as return current language onCreate in order to show current language selected?

更新

根据下面的答案,这是我的最新更新以及添加的其他文件.但是我的语言切换不起作用

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>

这就是我所要进行的语言切换.

This is all I have regarding to language switch.

PS-1:基于答案注释中提供的解决方案,我应该添加 BaseActivity 扩展了我的所有活动,但扩展了我的所有活动是 kotlin 而不是 java (settingsActivity除外),我无法添加它.

PS-1: based on provided solution in answer comments I should have add BaseActivity as extends in all my activites but as all my activities are kotlin not java (except settingsActivity) I was not able to add it.

PS-2:即使没有翻译,是因为我无法添加至少我应该能够看到我的翻译settingsActivity是 java 正确的吗?

PS-2: even if not getting translatations is because I couldn't add extends at very least I should be able to see translations in my settingsActivity which is java right?

您知道为什么此开关不起作用吗?

Any idea why this switch doesn't work?

推荐答案

注意

您可以从github存储库下载源代码

将当前的语言单选输入标记为选中

Mark current language radio input as selected

然后,您需要将区域设置更改标记/状态保存在 SharedPreferences

Then you need to save your locale change flag/state inside SharedPreferences

示例代码,请按照以下步骤操作

SAMPLE CODE follow these steps

创建一个类名 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);
        }
    }

}

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

Make changes when user select another radio button

  • 当用户更改语言时,您需要对其进行更新 SharedPreferences
  • 更改区域设置后,您需要重新启动或重新创建活动
  • 注意:您应该使用 RadioGroup.OnCheckedChangeListener()而不是 android:onClick ="onRadioButtonClicked"

    Note : you should use RadioGroup.OnCheckedChangeListener() instead of 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;
                    }
                }
            });
        }
    
    }
    

    请按照我之前的回答更改区域设置运行时间

    Please follow this my previous answer to change locale runtime

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

    这篇关于Android Studio中的appLocale设置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆