Friday, August 14, 2015

How to add a hint to Spinner in Android

Add a Hint to Spinner
Spinner allows users to select an item from a list. The item list is shown in a drop-down list. Android app users can select one value at a time. This is a single selection drop-down menu. By default Spinner shows a single value at a time and this is the selected value.

There is no direct way to show a hint in the Spinner widget. A hint is useful to guide users on what they should do in this widget. Such as a hint maybe with the text ‘Select an item’. The hint should be a nonselectable item and this is not the actual list value.

In this android app development tutorial, we will learn how can we add a hint to the Spinner widget. At first, we have to create an activity XML file where we put the Spinner widget.

The java file will allow us to make an array adapter to populate the Spinner widget with items. After creating an array adapter we will bind this adapter with Spinner control. At the beginning of the item array, we will put an extra item that will act as a Spinner hint, such as ‘Select an item’.

While we create the array adapter, we will disable the first element to make it a Spinner hint. Same time we will apply a dim color to the hint item text color. So it will clearly be visible as a non-selectable hint item. On other items’ text, we will apply black color which will display as Spinner selectable items.

Finally, on the Spinner selected item listener, we will display a toast message while the user selects an item from Spinner except for the first item. The first item will act as a Spinner hint.
MainActivity.java

package com.cfsuman.androidtutorials;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                // Get the widgets reference from XML layout
                Spinner spinner = findViewById(R.id.spinner);


                // Initializing a String Array
                String[] plants = new String[]{
                        "Select an item...",
                        "California sycamore",
                        "Mountain mahogany",
                        "Butterfly weed",
                        "Carrot weed"
                };


                // Convert array to a list
                List<String> plantsList = new ArrayList<>
                        (Arrays.asList(plants));


                // Initializing an ArrayAdapter
                ArrayAdapter<String> spinnerArrayAdapter
                        = new ArrayAdapter<String>(
                        this,
                        android.R.layout.simple_dropdown_item_1line,
                        plantsList
                ){
                        @Override
                        public boolean isEnabled(int position){
                                // Disable the first item from Spinner
                                // First item will be use for hint
                                return position != 0;
                        }
                        @Override
                        public View getDropDownView(
                                int position, View convertView,
                                @NonNull ViewGroup parent) {

                                // Get the item view
                                View view = super.getDropDownView(
                                        position, convertView, parent);
                                TextView textView = (TextView) view;
                                if(position == 0){
                                        // Set the hint text color gray
                                        textView.setTextColor(Color.GRAY);
                                }
                                else { textView.setTextColor(Color.BLACK); }
                                return view;
                        }
                };


                // Set the drop down view resource
                spinnerArrayAdapter.setDropDownViewResource(
                        android.R.layout.simple_dropdown_item_1line
                );


                // Spinner on item selected listener
                spinner.setOnItemSelectedListener(
                        new AdapterView.OnItemSelectedListener() {

                        @Override
                        public void onItemSelected(
                                AdapterView<?> parent, View view,
                                int position, long id) {

                                // Get the spinner selected item text
                                String selectedItemText = (String) parent
                                        .getItemAtPosition(position);

                                // If user change the default selection
                                // First item is disable and
                                // it is used for hint
                                if(position > 0){
                                        // Notify the selected item text
                                        Toast.makeText(
                                                getApplicationContext(),
                                                "Selected : "
                                                        + selectedItemText,
                                                Toast.LENGTH_SHORT).show();
                                }
                        }

                        @Override
                        public void onNothingSelected(
                                AdapterView<?> parent) {
                        }
                });


                // Finally, data bind the spinner object with adapter
                spinner.setAdapter(spinnerArrayAdapter);
        }
}
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#DCDCDC"
    android:padding="64dp">

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>