Due to how the Android SDK and Java are setup it isn’t really a simple task to link up an array with a spinner control. I’ll go over some basics I just learned of the process. In this example I setup a setting control that will allow the user to select from a list of values. The spinner control will be initialized by the global setting value (from a black box object in this example), and a control listener will be defined that allows the user to change the global setting.
To define a list of string values that can be loaded into android controls you would do something like this. You can add an arrays.xml file to your project (in the /res/values directory):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="settinglist01">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
</string-array>
</resources>
To make a spinner control, add this to an activity layout xml file:
<Spinner
android:id="@+id/settingList01Spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:prompt="@string/misctextfromstringsxmlfile"
android:entries="@array/settinglist01" />
The misctextfromstringsxmlfile item would be a string value in your strings.xml file. This is displayed when the user selects the spinner control to change the value:
<string name="misctextfromstringsxmlfile">Spinner Example Items:</string>
In your Activity onCreate() function or similar you can setup the spinner and related code to change values:
String[] settingsSpinner01Values;
Resources resourcePointer = getResources();
settingsSpinner01Values = resourcePointer.getStringArray(R.array.settinglist01);
Spinner settings01Spinner = (Spinner) this.findViewById(R.id.settingList01Spinner);
settings01Spinner.setSelection(findInStringArray(settingsSpinner01Values, settingsObject.getSettingValue(Settings.setting01)));
settings01Spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// Implementation for when nothing is selected
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selectedValue = settingsSpinner01Values[position];
if (!selectedValue.equals("")) {
settingsObject.setSettingValue(Settings.setting01, selectedValue);
}
}
});
/**
* A simple sequential search function to find values in a string array.
*
* @param arrayToSearch The array to search through.
* @param valueToFind The value to find within the array.
* @return -1 if the value is not found, otherwise the index of the item found.
*/
private int findInStringArray(String[] arrayToSearch, String valueToFind) {
boolean searching = true;
int counter = 0;
int returnValue = -1;
// Do a simple sequential search
while (searching && counter < arrayToSearch.length) {
// Look for the needle in the haystack
if (valueToFind.equalsIgnoreCase(arrayToSearch[counter])) {
// We found the value we are looking for, so return the related index
searching = false;
returnValue = counter;
} else {
counter++;
}
}
return returnValue;
}
settingsObject.getSettingValue(Settings.setting01) is a function of your design that will return a setting value or whatever else your are doing. In my example it is just a class that would save global setting values. The same thing goes for settingsObject.setSettingValue(Settings.setting01, selectedValue); but the reverse process to save a new spinner value that was selected by the user.
We create a OnItemSelectedListener() instance that will be called when the user selects a value. In our code, we just set the black box setting object with the new value.