是否可以在使用Android资源的同时以编程方式更改应用程序的语言?
如果没有,是否可以请求特定语言的资源?
我想让用户从应用程序更改应用程序的语言.
我有一个Activity
3 EditText
秒和一个自定义视图,它作用一个专门的键盘来添加信息到EditText
s.
目前我正在将Activity
视图传递给视图,以便我可以获得当前聚焦的编辑文本并更新自定义键盘中的内容.
有没有一种方法可以引用父活动并在EditText
不将活动传递到视图的情况下获得当前的焦点?
当我需要从应用程序本身更改应用程序区域设置时(即在应用程序内部具有语言更改设置),我遇到AAB问题,问题是AAB只给我设备语言资源,例如:
我的设备中安装了英语和法语,所以AAb只给我英语和法语的资源,
但是从应用程序本身可以选择在英语,法语和印尼语之间切换语言,
在这种情况下,当将语言更改为英语或法语时,一切都运行良好,但是当将其更改为印度尼西亚语时,应用程序只需进入崩溃循环,因为它一直在寻找印尼语,但却无法找到.
这里的问题是,即使我重新启动应用程序,它再次进入崩溃循环,因为应用程序仍在寻找缺少的语言资源,这里唯一的解决方案是清理现金或重新安装哪些是普通用户赢得的解决方案不去.
只是提一下,这是我通过应用程序更改语言环境的方式:
// get resources
Resources res = context.getResources();
// create the corresponding locale
Locale locale = new Locale(language); // for example "en"
// Change locale settings in the app.
android.content.res.Configuration conf = res.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
conf.setLocale(locale);
conf.setLayoutDirection(locale);
} else {
conf.locale = locale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
context.getApplicationContext().createConfigurationContext(conf);
}
res.updateConfiguration(conf, null);
Run Code Online (Sandbox Code Playgroud)
PS该应用程序在将其构建为APK时工作正常.
我有一个支持多种语言的旧项目。我想升级支持库和目标平台,在迁移到Androidx之前,一切正常,但现在更改语言无效!
我使用此代码更改App的默认语言环境
private static Context updateResources(Context context, String language)
{
Locale locale = new Locale(language);
Locale.setDefault(locale);
Configuration configuration = context.getResources().getConfiguration();
configuration.setLocale(locale);
return context.createConfigurationContext(configuration);
}
Run Code Online (Sandbox Code Playgroud)
并在每个活动上通过attachBaseContext
这样的覆盖调用此方法:
@Override
protected void attachBaseContext(Context newBase)
{
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String language = preferences.getString(SELECTED_LANGUAGE, "fa");
super.attachBaseContext(updateResources(newBase, language));
}
Run Code Online (Sandbox Code Playgroud)
我尝试其他方法来获取字符串,但我注意到了吗?getActivity().getBaseContext().getString
工作,而getActivity().getString
不是工作。即使以下代码也不起作用,并且始终app_name
在默认资源string.xml中显示vlaue。
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"/>
Run Code Online (Sandbox Code Playgroud)
我在https://github.com/Freydoonk/LanguageTest中共享示例代码
也getActivity()..getResources().getIdentifier
行不通,总是返回0!
我正在研究Android应用程序的全球化.我必须提供从应用程序中选择不同区域设置的选项.我在我的活动(HomeActivity)中使用以下代码,其中我提供了更改语言环境的选项
Configuration config = new Configuration();
config.locale = selectedLocale; // set accordingly
// eg. if Hindi then selectedLocale = new Locale("hi");
Locale.setDefault(selectedLocale); // has no effect
Resources res = getApplicationContext().getResources();
res.updateConfiguration(config, res.getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)
只要没有像屏幕旋转那样的配置更改,其中locale默认为android系统级别语言环境而不是代码设置的语言环境,这样就可以正常工作.
Locale.setDefault(selectedLocale);
Run Code Online (Sandbox Code Playgroud)
我能想到的一个解决方案是使用SharedPreferences持久保存用户选择的语言环境,并且在每个活动的onCreate()方法中将语言环境设置为持久语言环境,因为onCreate()会在每次配置更改时反复调用.有没有更好的方法来做到这一点,所以我不必在每个活动中都这样做.
基本上我想要的是 - 一旦我在我的HomeActivity中更改/设置为某个区域设置,我希望我的应用程序中的所有活动都使用该区域设置本身而不管任何配置更改....除非并且直到将其更改为其他区域设置应用程序的HomeActivity提供更改区域设置的选项.
我们正在开发一个应用程序,我们需要使用自定义字体(Typeface
从应用程序的资产中加载)EditText
.所述的Android输入方法文档声明如下:
当输入焦点移入或移出可编辑的文本字段时,Android会根据需要显示或隐藏输入法(例如屏幕键盘).系统还会决定UI和文本字段在输入方法上方的显示方式.例如,当屏幕上的垂直空间受到约束时,文本字段可能会填充输入方法上方的所有空间.
这是大胆的部分让我们绊倒.短语"文本字段可能填充..."似乎具有误导性,因为使用的文本字段不是EditText
我们使用自定义字体设置的字段.(注意:到目前为止的答案都解释了如何设置自定义字体EditText
.我们已经在设置自定义字体EditText
.请在回答前仔细阅读问题.)这是隐藏输入法的屏幕截图:
这是软键盘显示和垂直空间受限时会发生的情况:
如您所见,输入法上方文本字段中的字体不是我们的自定义字体(我猜它是系统的默认Roboto字体).对于我们尝试作为输入法的每个软键盘都会发生这种情况.
我想强调的是,当空间受限制时,键盘上方的这个视图是由系统内部生成的,而不是由我们的任何代码生成的.
主要问题是:是否有一种方法(如果是这样,它是什么?)来控制这种方式的外观(缺乏更好的术语)代理视图 - 至少让它使用我们的自定义字体?
如果我们还可以控制键盘上方整个代理区域的布局和外观(包括"完成"按钮),这将是一个额外的好处.我们使用此线程中描述的技术的变体来使我们的活动使用与系统中设置的区域不同的区域设置,但是活动的区域设置显然未在此处应用.(如果是的话,按钮会在左边,并且会显示"בוצע",如果我将设备的区域设置更改为希伯来语,就会发生这种情况.[编辑:我可以通过使用该android:imeActionLabel
属性获得正确的按钮标签EditText
.但是,我不知道如何控制布局方向性.])
编辑每个请求,这是我如何构建我的对话框(相关部分摘自a DialogFragment
):
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Dialog dlg = new Dialog(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar);
dlg.setContentView(R.layout.edit_note_dialog);
mAnimator = (ViewAnimator) dlg.findViewById(R.id.animator);
final Typeface hebrew = SystemData.getHebrewFont();
mNoteEditor = (EditText) dlg.findViewById(R.id.note_field);
mNoteEditor.setTypeface(hebrew);
// etc. (setting fonts for other elements, adding listeners, etc.)
}
Run Code Online (Sandbox Code Playgroud)
这是布局:
<?xml version="1.0" …
Run Code Online (Sandbox Code Playgroud) android android-softkeyboard android-input-method android-edittext
假设我有2个主题的应用程序:男性化和女性化.主题只是改变了调色板和一些drawables,以吸引用户的首选品味.
非常感谢http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html提供了他的工作提示.
但现在让我们说我希望得到一个有点可爱的应用程序,不仅改变颜色和drawables,但我也想改变字符串.例如,我可能想要添加一个盗版主题,然后"提交"将是"Arrrrgh!"
所以,我的基本问题是:如何通过用户可选择的主题更改我的应用程序中的字符串?
编辑:
做到这一点:该应用程序有12个按钮和32个文本视图我想要主题依赖,我想在没有巨型映射或大量定制attrs的情况下完成此操作.
所有3种当前解决方案都可以使用.寻找更干净的东西虽然我不知道这样的野兽存在.
如何设置西班牙语拉丁美洲的区域设置?
我已将所有字符串存储在西班牙拉丁美洲的 value-b+es+r419 文件夹中。但无法在区域设置中设置此语言。应用程序仅显示默认语言,而不是更改应用程序的语言。
Locale locale = new Locale("es","419");
Locale.setDefault(locale);
Configuration config = new Configuration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
config.setLocale(locale);
} else{
config.locale=locale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
context.createConfigurationContext(config);
} else {
context.getResources()
.updateConfiguration(config, context.getResources().getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud) 我有一个只有俄罗斯语言环境的应用程序。如果我没有记错的话,则string.xml
在res/values
默认情况下是英语语言环境。但是英语和俄语有不同的复数形式。例如:
俄语:
用英语:
当用户将系统语言从俄语更改为其他语言时,问题就开始了。如何更改应用程序的默认语言?或者也许可以强制应用程序使用俄语复数?
我在将语言更改为 Android 6.0.1 时遇到问题,在新的 Android 版本上更改语言效果很好,但在 6.0.1 上设置默认字符串,而不管设备设置的语言如何。模拟器可以工作,但是当我在三星 J5 上安装 apk 时,它在 Android 6.0.1 上工作,更改语言不起作用。我的问题有什么解决办法吗?谢谢你。
private void setLocale(String lang) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Locale locale = new Locale(lang);
Locale.setDefault(locale);
Configuration config =
getBaseContext().getResources().getConfiguration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
} else {
Resources resources = getBaseContext().getResources();
Configuration configuration = resources.getConfiguration();
configuration.setLocale(new Locale(lang));
getBaseContext().getApplicationContext().createConfigurationContext(configuration);
}
// shared pref.
SharedPreferences.Editor editor = getSharedPreferences("Settings", MODE_PRIVATE).edit();
editor.putString("My_Lang", lang);
editor.apply();
}
Run Code Online (Sandbox Code Playgroud) android ×10
locale ×4
java ×2
localization ×2
resources ×2
string ×2
android-view ×1
androidx ×1
themes ×1