选择其中一个显示值时,ListPreference会出错

时间:2018-03-01 18:28:45

标签: java android android-preferences

我该如何解决?一旦我从ListPreference中的项目列表中选择了一个项目,我就会收到如下错误。

  

AndroidRuntime:FATAL EXCEPTION:主要                                                                               过程:com.mobilaris.eunomia.client,PID:2998                                                                               java.lang.IllegalStateException:ListPreference需要一个条目   数组和entryValues数组。

代码如下。 SettingsActivity.java下的类

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.pref_map_layers);
  setHasOptionsMenu(true);

  mapMessagesHandler.getMapLayers();

  final ListPreference listPreference = (ListPreference) findPreference("maps_list");

  if(listPreference != null) {
    HashMap<Integer, String> mapsList = MapManager.getMaps();

    for(final int value : mapsList.keySet()) {

      listPreference.setSummary(mapsList.get(value));
      listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
          MapManager.setSelectedMapInstance(value);
          preference.setSummary(listPreference.getEntry().toString());
          return true;
        }
      });
    }
  } else {
    logger.error("No map to select");
  }
}

XML如下。

  <PreferenceCategory>

    <ListPreference android:key="maps_list"
                    android:defaultValue="3" />

  </PreferenceCategory>

</PreferenceScreen>

1 个答案:

答案 0 :(得分:0)

您需要提供数组作为错误状态:“ListPreference需要条目数组和entryValues数组。

添加arrays.xml

<resources>
<string-array name="entries_array">
    <item>1</item>
    <item>2</item>
    <item>3</item>
    <item>4</item>
    <item>5</item>
</string-array>
<string-array name="entries_values_array">
    <item>1</item>
    <item>2</item>
    <item>3</item>
    <item>4</item>
    <item>5</item>
</string-array>
</resources>

引用ListPreferences

中的数组
<ListPreference android:key="maps_list"
    android:entries="@array/entries_array"
    android:entryValues="@array/entries_values_array"
    android:defaultValue="3" />

从mapsList:

加载数组的示例
if(listPreference != null) {
    HashMap<Integer, String> mapsList = MapManager.getMaps();
    String[] entries = new String[mapsList.size()];
    String[] entryValues = new String[mapsList.size()];
    Iterator<Map.Entry<Integer, String>> iter = mapsList.entrySet().iterator();

    int i = 0;
    while(iter.hasNext()) {
        Map.Entry<Integer, String> mapping = iter.next();
        entries[i] = mapping.getKey().toString();
        entryValues[i] = mapping.getValue().toString();
        i++;
    }
    listPreference.setEntries(entries);
    listPreference.setEntryValues(entryValues);
    listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
          MapManager.setSelectedMapInstance(value);
          preference.setSummary(listPreference.getEntry().toString());
          return true;
        }
      });
    }
  } else {
    logger.error("No map to select");
  }