【问题标题】:Get the string name attribute in the strings.xml from a spinner value从微调器值获取 strings.xml 中的字符串名称属性
【发布时间】:2015-09-27 20:26:45
【问题描述】:

我的 android 应用中有一个微调器(如组合框),用于选择您要更改的语言,因此微调器根据手机的当前语言环境仅显示数组中的 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" 因为如果我不能检查这个,我必须检查 9 次而不是 3 次,如果我想更改语言的值,我必须将其更改为两个位置。

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

我在 Windows 10 上运行 Android Studio 1.3.2。

真心希望有人能帮帮我^^

【问题讨论】:

    标签: java android xml android-spinner


    【解决方案1】:

    您将需要一个自定义的SpinnerAdapter

    首先,让我们建立我们的 XML。

    我们将只使用字符串数组来定义语言列表的顺序。 我们还将在这里定义正确的语言代码。

    /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 文件中,我们将定义语言名称

    例如,在/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) {
        }
    });
    

    【讨论】:

      【解决方案2】:

      好吧,我尝试在我的应用程序中使用你的代码,但它不起作用,所以我重新创建了另一个项目,我使用了你的代码,但出现了一些错误:

      我在setOnItemSelectedListener 上收到一条错误消息,即“无法解析符号'setOnItemSelectedListener'”,因此我在类名后添加了implements AdapterView.OnItemSelectedListener 并删除了spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()

      String[] codes = resources.getStringArray(R.id.spinner_lang_code);String[] names 的相同功能不起作用,因此我将其替换为 R.array.spinner_lang_codeR.array.spinner_lang

      我还添加了您在/res/values/strings.xml/res/values-en/strings.xml 中提到的值。

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

      package com.example.nicolas.labo1;
      
      import android.annotation.TargetApi;
      import android.content.Context;
      import android.content.res.Configuration;
      import android.content.res.Resources;
      import android.os.Build;
      import android.support.v7.app.AppCompatActivity;
      import android.os.Bundle;
      import android.view.LayoutInflater;
      import android.view.Menu;
      import android.view.MenuItem;
      import android.view.View;
      import android.view.ViewGroup;
      import android.widget.AdapterView;
      import android.widget.ArrayAdapter;
      import android.widget.BaseAdapter;
      import android.widget.Spinner;
      import android.widget.TextView;
      
      import java.util.Locale;
      
      public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{
          Spinner spinner;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              spinner = (Spinner) findViewById(R.id.spinner);
      
              ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.spinner_lang, android.R.layout.simple_spinner_item);
              spinner.setAdapter(adapter);
              spinner.setOnItemSelectedListener(this);
          }
      
          @Override
          public boolean onCreateOptionsMenu(Menu menu) {
              // Inflate the menu; this adds items to the action bar if it is present.
              getMenuInflater().inflate(R.menu.menu_main, menu);
              return true;
          }
      
          @Override
          public boolean onOptionsItemSelected(MenuItem item) {
              // Handle action bar item clicks here. The action bar will
              // automatically handle clicks on the Home/Up button, so long
              // as you specify a parent activity in AndroidManifest.xml.
              int id = item.getItemId();
      
              //noinspection SimplifiableIfStatement
              if (id == R.id.action_settings) {
                  return true;
              }
      
              return super.onOptionsItemSelected(item);
          }
      
          @Override
          public void onResume(){
              super.onResume();
              changeLanguage();
          }
      
          public void changeLanguage(){
              Locale loc = new Locale(Locale.getDefault().toString());
              Configuration config = getBaseContext().getResources().getConfiguration();
              Configuration conf = new Configuration(config);
              conf.locale = loc;
              getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics());
          }
      
          public void changeLanguage(Locale l){
              Locale loc = new Locale(l.toString());
              Configuration config = getBaseContext().getResources().getConfiguration();
              Configuration conf = new Configuration(config);
              conf.locale = loc;
              getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics());
          }
      
          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.array.spinner_lang_code);
                  String[] names = resources.getStringArray(R.array.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;
              }
          }
      
          @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);
      
              changeLanguage(locale);
          }
      
          @Override
          public void onNothingSelected(AdapterView<?> parent) {
          }
      }
      

      但这是我第一次使用 android 和 java,我星期五在学校上了第一节课,所以我对一些你可以认为是“基础”的东西不太放心,所以如果我这样做了,我很抱歉一些巨大的错误^^

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-16
        • 2022-11-28
        • 2017-08-18
        • 1970-01-01
        • 2014-03-06
        • 2011-11-14
        • 1970-01-01
        • 2021-06-28
        相关资源
        最近更新 更多