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;
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 OnItemSelectedListener() {
    @Override
    public void onNothingSelected(AdapterView<?> parentView) {}

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        String selectedValue = stationCountSpinnerValues[position];
        if(selectedValue != "") {
            settingsObject.setSettingValue(Settings.setting01, selectedValue);
        }
    }
});


/**
 * a simple sequential search function to find values in a string array
 * 
 * @param arrayToSearch
 * @param valueToFind
 * @return -1 or 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 == true && counter < arrayToSearch.length) {
		//look for the needle in the hay-stack
		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.

This entry was posted in General and tagged , , , , . Bookmark the permalink.