Android SDK: String Arrays and Controls like Spinners

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.