我的Android应用程序中有一个微调器(如comboBox),用于选择要更改的语言,因此微调器根据手机的当前区域设置仅显示阵列中的3种语言:
<string-array name="spinner_lang">
<item>@string/lang_en</item>
<item>@string/lang_fr</item>
<item>@string/lang_jp</item>
</string-array>
以下是我的所有strings.xml资源文件:http://i.stack.imgur.com/u667T.png
当我点击我的微调器时,我只能获得语言的原始值,即:English
或French
但我需要的是获取语言的关键名称,这里是“lang_en
”或“lang_fr
”,因为如果我无法检查这一点,我必须检查九次而不是三次,如果我想更改语言的值,我必须更改它到两个地方。
我使用关键字“获取字符串值xml的名称”和“如何获取字符串的语言环境”进行了大量研究,但我什么也没找到,也许这不是好的关键字。我需要的是获取一个字符串,我可以将其转换为forLanguageTag(String languageTag)
的语言环境,为我的函数public void changeLanguage(Locale l)
提供参数,这样我就可以使用我的微调器更改应用程序区域设置。
我在Windows 10上运行Android Studio 1.3.2。
我真的希望有些人会帮助我^^
答案 0 :(得分:0)
您需要自定义SpinnerAdapter
。
首先,让我们建立我们的XML。
我们仅使用字符串数组来定义语言列表的 order 。 我们还会在此处定义正确的语言代码。
在/res/values/strings.xml
中(即不是特定于语言环境):
<string-array name="spinner_lang">
<item>en</item>
<item>es</item>
<item>fr</item>
</string-array>
<string-array name="spinner_lang_code">
<item>code_en</item>
<item>code_es</item>
<item>code_fr</item>
</string-array>
<string name="code_en">en-US</string>
<string name="code_es">es-ES</string>
<string name="code_fr">fr-FR</string>
现在,在您的语言环境特定的string.xml文件中,我们将定义语言 names 。
例如,在/res/values-en/strings.xml
<string name="en">English</string>
<string name="es">Spanish</string>
<string name="fr">French</string>
让我们创建一个简单的(内部)类来保存我们的语言数据:
public static class Lang {
String mCode;
String mName;
public Lang(String code, String name) {
this.mCode = code;
this.mName = name;
}
}
现在我们应该拥有编写适配器代码的所有内容:
public static class LanguageSelectionAdapter extends BaseAdapter {
private Lang[] mLangs;
public LanguageSelectionAdapter(Context context) {
Resources resources = context.getResources();
String[] codes = resources.getStringArray(R.id.spinner_lang_code);
String[] names = resources.getStringArray(R.id.spinner_lang);
mLangs = new Lang[names.length];
for (int i = 0; i < names.length; i++) {
int codeRes = resources.getIdentifier(codes[i], "string", null);
String code = resources.getString(codeRes);
int nameRes = resources.getIdentifier(names[i], "string", null);
String name = resources.getString(nameRes);
mLangs[i] = new Lang(code, name);
}
}
@Override
public int getCount() {
return mLangs == null ? 0 : mLangs.length;
}
@Override
public Object getItem(int position) {
return mLangs == null ? null : mLangs[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
}
TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
text1.setText(mLangs[position].mName);
return convertView;
}
}
现在当有人从Spinner
中选择一个项目时,您需要根据他们选择的语言名称获取语言代码:
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
LanguageSelectionAdapter adapter = (LanguageSelectionAdapter) parent.getAdapter();
Lang lang = (Lang) adapter.getItem(position);
String langCode = lang.mCode;
Locale locale = Locale.forLanguageTag(langCode);
// ... switch your Locale here
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
答案 1 :(得分:0)
好吧,我尝试将您的代码用于我的应用程序,它没有工作,所以我重新创建了另一个项目,我使用了您的代码但是有一些错误:
我在ol.View.fit()
上收到错误消息&#34;无法解析符号&#39; setOnItemSelectedListener&#39;&#34;,所以我在课程名称后面添加了setOnItemSelectedListener
我删除了implements AdapterView.OnItemSelectedListener
。
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
和String[] codes = resources.getStringArray(R.id.spinner_lang_code);
的{{1}}相同,所以我将其替换为String[] names
和R.array.spinner_lang_code
。
我还在R.array.spinner_lang
和/res/values/strings.xml
添加了您提到的值。
我试图解决这些错误,但以下代码(根据android studio没有任何错误)在启动时崩溃了我的应用程序:
/res/values-en/strings.xml
但这是我第一次使用android和java,我周五在学校上了第一堂课,所以我对你可以考虑的一些事情并不是很放心#34;基础知识&# 34;,所以如果我犯了一些大错,我很抱歉^^