【问题标题】:Using list preference in Android在 Android 中使用列表首选项
【发布时间】:2012-04-10 11:18:17
【问题描述】:

我有一个文本转语音应用程序,用户可以在其中选择一种语言,也可以选择男声或女声。问题是每种语言都有不同的字符串来称为男性和女性的声音,但在我的偏好中,我只有两个选项(男性和女性)。

<string-array name="Language">
    <item>English (US)</item>
    <item>English (UK)</item>
    <item>French (France)</item>
    <item>Spanish (Spain)</item>
    <item>Italian</item>
</string-array>

<string-array name="languageAlias">
    <item>"en-US"</item>
    <item>"en-GB"</item>
    <item>"fr-FR"</item>
    <item>"es-ES"</item>
    <item>"it-IT"</item>
</string-array>

<string-array name="Voice">
    <item>Male</item>
    <item>Female</item>
</string-array>

<string-array name="VoiceAlias">
    <item>"usenglishmale"</item>
    <item>"usenglishfemale"</item>
    <item>"ukenglishmale"</item>
    <item>"ukenglishfemale"</item>
    <item>"eurfrenchmale"</item>
    <item>"eurfrenchfemale"</item>
    <item>"eurspanishmale"</item>
    <item>"eurspanishfemale"</item>
    <item>"euritalianmale"</item>
    <item>"euritalianfemale"</item>        
</string-array>

我正在尝试找到一种方法,根据所选语言仅引用相关的男性和女性 voiceAlias。是否可以在这里执行此操作,或者我是否必须编写一些代码来根据所选语言更改 voiceAlias 数组的值?

提前致谢

【问题讨论】:

    标签: android preferences text-to-speech listpreference


    【解决方案1】:

    字符串数组可以使用字符串资源。这是翻译用户价值的最简单(也可能是最简单)的方法。

    <string-array name="user_values">
        <item>@string/value_1</item>
        <item>@string/value_2</item>
    </string-array>
    

    Working with Strings and String Arrays

    【讨论】:

      【解决方案2】:

      好的,您可以使用两个ListPreferences 和一个OnPreferenceChangeListener 来完成此操作。首先是 XML:

      <ListPreference 
          android:key="language_preference"
          android:title="Language"
          android:entries="@array/Language"
          android:entryValues="@array/languageAlias"/>
      
      <ListPreference 
          android:key="gender_preference"
          android:title="Gender"
          android:entries="@array/Voice"
          android:entryValues="@array/VoiceData"/>
      

      让我们在 res/values/array.xml 中创建一个新条目:

      <string-array name="VoiceData">
          <item>0</item>
          <item>1</item>
      </string-array>
      

      现在,在您对PreferenceActivity 的扩展中,我们将采用保留在您的SharedPreferences 中的字符串值,并从中在SharedPreferences 中创建一个全新的条目,该条目的值来自“VoiceAlias” .

      SharedPreferences shareprefs = getPreferenceManager().getSharedPreferences();
      Resources resources = YourContext.getResources();
      
      private void makeVoiceData() {
          String languageData = shareprefs.getString("language_preference", "en-US");
          int genderData = Integer.parseInt(shareprefs.getString("gender_preference", "0"));
          String[] voiceAlias = resources.getStringArray(R.array.VoiceAlias);
      
          int a = 0
          String[] languageAlias = resources.getStringArray(R.array.languageAlias);
          for (a ; a < languageAlias.length ; a++) {
              if (languageAlias[a].equals(languageData)) {
                  break;
              }
          }
      
          shareprefs.putString("VoiceAlias", voiceAlias[(2 * a) + genderData]);
      }
      
      ListPreference language_preference = getPreference("language_preference");
      ListPreference gender_preference = getPreference("gender_preference");
      
      language_preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
          public boolean onPreferenceChanged(Preference preference, Object newValue) {
              shareprefs.putString("language_preference", (String) newValue);
              makeVoiceData();
          }
      });
      
      gender_preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
          public boolean onPreferenceChanged(Preference preference, Object newValue) {
              shareprefs.putString("gender_preference", (String) newValue);
              makeVoiceData();
          }
      });
      

      【讨论】:

      • 谢谢,我喜欢这种方法。然而这行代码是做什么的呢? voiceAlias[(2 * a) + genderData]
      • a的值在for循环中定义,它代表languageAlias中languageData的索引。循环在 languageAlias 中循环,直到找到 languageData 的值。 a 的值乘以 2,因为语音在 voiceAlias 中成对存在。性别数据被添加到这里。如果用户选择了男性,则添加 0 并采用语言对的第一个选项。如果是女性,则添加 1。
      • 在仔细查看文档后,ListPreference 似乎想要保留一个字符串。如果您发现是这种情况,只需将 genderData 的声明包装为 Integer.parseInt(shareprefs.getString...)
      • 什么是getPreference()?
      • 请注意,SharedPreferences 需要在编辑时调用 edit()commit()apply()
      【解决方案3】:

      抱歉,我还不能对答案发表评论,所以我打开了一个新答案。

      无需编写自己的算法来查找 String 数组中特定项目的索引,只需依赖标准 API(它通常更快、更好的设计并且更短):

      final int a = Arrays.binarySearch(languageAlias, languageData);
      

      和以下一样:

      int a = 0
      
      for (a ; a < languageAlias.length ; a++) {
          if (languageAlias[a].equals(languageData) {
              break;
          }
      }
      

      【讨论】:

      • 以下不是二分查找。和@gobernador,不,不会。
      猜你喜欢
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 2017-04-27
      • 2021-03-26
      • 1970-01-01
      相关资源
      最近更新 更多