从微调器值

时间:2015-09-27 01:26:23

标签: java android xml android-spinner

我的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

当我点击我的微调器时,我只能获得语言的原始值,即:EnglishFrench但我需要的是获取语言的关键名称,这里是“lang_en”或“lang_fr”,因为如果我无法检查这一点,我必须检查九次而不是三次,如果我想更改语言的值,我必须更改它到两个地方。

我使用关键字“获取字符串值xml的名称”和“如何获取字符串的语言环境”进行了大量研究,但我什么也没找到,也许这不是好的关键字。我需要的是获取一个字符串,我可以将其转换为forLanguageTag(String languageTag)的语言环境,为我的函数public void changeLanguage(Locale l)提供参数,这样我就可以使用我的微调器更改应用程序区域设置。

我在Windows 10上运行Android Studio 1.3.2。

我真的希望有些人会帮助我^^

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[] namesR.array.spinner_lang_code

我还在R.array.spinner_lang/res/values/strings.xml添加了您提到的值。

我试图解决这些错误,但以下代码(根据android studio没有任何错误)在启动时崩溃了我的应用程序:

/res/values-en/strings.xml

但这是我第一次使用android和java,我周五在学校上了第一堂课,所以我对你可以考虑的一些事情并不是很放心#34;基础知识&# 34;,所以如果我犯了一些大错,我很抱歉^^