I'd like to know a better approach to improve performance of my program. The objective is to load resources automatically, I'm using names of string or string-array elements. For example, if I have the next resources:
<string name="temperature">temperature</string>
<string name="pressure">pressure</string>
<string name="velocity">velocity</string>
...
<string-array name="measures">
<item>@string/temperature</item>
<item>@string/pressure</item>
<item>@string/velocity</item>
...
</string-array>
<string name="name_temperature">Temperature</string>
<string name="name_pressure">Pressure</string>
<string name="name_velocity">Velocity</string>
...
<string-array
name="name_measures">
<item>@string/name_temperature</item>
<item>@string/name_pressure</item>
<item>@string/name_velocity</item>
...
</string-array>
<string-array name="units_temperature">
<item>K</item>
<item>°C</item>
<item>°F</item>
<item>R</item>
</string-array>
I'm loading resources this way:
measuresMap = new HashMap<String, String>();
String[] measures = getResources().getStringArray(R.array.measures);
for(int i = 0; i < measures.length; i++){
measuresMap.put(measures[i], getResources().getString(getResources().getIdentifier("name_" + measures[i], "string", getActivity().getPackageName())).toString());
}
i.e. I'm mapping the string-array values from 'measures' to it's corresponding string 'name_<>'.
I'm using a Spinner to select the measure, for example, 'Temperature':
measureSpinner = (Spinner) view.findViewById( R.id.spinnerConverter );
setSpinner(measureSpinner, R.array.name_measures, android.R.layout.simple_spinner_item, android.R.layout.simple_spinner_dropdown_item);
When an item is selected, a method retrieves the key from the Map depending on the item's string of the Spinner (getKeyByValueFromMap from here):
String[] units = getResources().getStringArray(getResources().getIdentifier("units_" + getKeyByValueFromMap(measuresMap, measureSpinner.getSelectedItem().toString()), "array", getActivity().getPackageName()));
public <T, E> T getKeyByValueFromMap(Map<T, E> map, E value) {
for (Map.Entry<T, E> entry : map.entrySet()) {
if (value.equals(entry.getValue())) {
return entry.getKey();
}
}
return null;
}
I need to do this to populate a NumberPicker:
String[] units = getResources().getStringArray(getResources().getIdentifier("units_" + getKeyByValueFromMap(measuresMap, measureSpinner.getSelectedItem().toString()), "array", getActivity().getPackageName()));
I think this is somehow inefficient. I read something about loading arrays with a TypedArray. I thought of a multidimensional String array. The objective is the same: load resources automatically (driven by the for loop to populate the Map). Is a HashMap the best option? It would be easier if a resource name could be defined with another resource string:
<string name="@string/temp">Temperature</string>