Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add floating label on Spinner

After using the Android Design Support Library's TextInputLayout to place a floating label above an EditText component, I was wondering if there is a way to add a floating label to the Spinner component (not necessarily using the Design Library).

By this, I mean something like a TextView placed above the Spinner (obviously no animations like the TextInputLayout), but I want the text size, font and colour to match that of the TextInputLayout's floating label.

For example, it would look something like this (see the labels above the Spinners):

enter image description here

As I mentioned before, my main aim is to have a label above the Spinner, just as in the TextInputLayout - so text size, font, colour, and distances between the label and the component would be the same.

On the Google Design page about floating label text fields, there is a diagram showing dimensions of the label relative to the component, but there is no indication of the label text colour or size:

enter image description here

So, to summarise, I am asking:
- If there is a special component to achieve what I am asking or a custom view I can use, what would it be, and how can I use it.
- If not, what is the floating label text size, colour and font, so that I can place a TextView above my Spinner with the layout dimensions shown in the above image.


EDIT:

From the Google Design guidelines for text fields, it has the following for floating labels:

Hint and input font: Roboto Regular 16sp
Label font: Roboto Regular 12sp
Tile height: 72dp
Text top and bottom padding: 16dp
Text field divider padding: 8dp

as well as the images shown above.

So the floating label font is: Roboto Regular 12sp. You can therefore use a TextView to display the Spinner label as I do not know of any custom Views or special components you could use.

However, after trying it out, it does not look quite as good as the example shown in the image. A custom view may be better for this, as it could look nicer, but the solution above is just one way of achieving something close to what I originally wanted.

like image 548
Farbod Salamat-Zadeh Avatar asked Jul 25 '15 10:07

Farbod Salamat-Zadeh


People also ask

How do I add a spinner to my toolbar?

Adding spinner to app bar/ toolbar is very simple, you just need to create a XML file in res/menu/ folder and add a item like your over flow menu and spinner widget as item actionViewClass, rest in your java code. Spinner can be added to android actionbar/toolbar with many ways.

What is spinner in Android with example?

Android Spinner is a view similar to the dropdown list which is used to select one option from the list of options. It provides an easy way to select one item from the list of items and it shows a dropdown list of all values when we click on it.


2 Answers

I want the text size, font and colour to match that of the TextInputLayout's floating label.

This can be achieved easily without any external libraries. After trying to hack the TextInputLayout and even making my own custom view, I realized that using a simple TextView takes much less code and it's probably more efficient.

The text style can be copied from the AppCompat library.

The style

From the Material Design guidelines we get the following information:

  • the label should have a bottom margin of 8dp
  • the label should be vertically aligned with the input text

Here's what the guidelines do not mention about the Material EditText:

  • it has a left padding of 4dp
  • its label actually doesn't have any spacing of 16dp above it, this is left to the interface designer: this makes sense because if you place it under another EditText, you will only need an additional 8dp of space

Moreover, the Design Support Library contains this style for the label of a focused element:

<style name="TextAppearance.Design.Hint" parent="TextAppearance.AppCompat.Caption">     <item name="android:textColor">?attr/colorControlActivated</item> </style> 

Inactive elements simply use TextAppearance.AppCompat.Caption.

Implementation

Add the following to your dimens.xml file:

<dimen name="input_label_vertical_spacing">8dp</dimen> <dimen name="input_label_horizontal_spacing">4dp</dimen> 

Then add this to styles.xml:

<style name="InputLabel" parent="TextAppearance.AppCompat.Caption">     <item name="android:paddingBottom">@dimen/input_label_vertical_spacing</item>     <item name="android:paddingLeft">@dimen/input_label_horizontal_spacing</item>     <item name="android:paddingRight">@dimen/input_label_horizontal_spacing</item> </style> 

If you want the label to always have the highlighted (accent) color, replace TextAppearance.AppCompat.Caption with TextAppearance.Design.Hint from the Google Design Support Library. However, this will probably look a bit weird if you also have labeled EditText views on the same screen.

Finally, you can put a TextView above your Spinner (or any other element) with the style applied:

<TextView     android:layout_width="match_parent"     android:layout_height="wrap_content"     android:text="@string/category"     style="@style/InputLabel" /> 

Result

The following screenshot shows a simple example with two normal TextInputLayout views followed by a label and a Spinner. I didn't apply the additional 8dp spacing to separate them further, but this shows you that the size, font and color are reflected.

The elements inside the Spinner have a different padding, however I prefer to keep the vertical alignment with all the other labels to get a more uniform look.

enter image description here

like image 166
Andrea Lazzarotto Avatar answered Oct 02 '22 16:10

Andrea Lazzarotto


I achieved this by using an AutoCompleteTextView, disabling the keyboard and showing the options on touch.

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.locations));  AutoCompleteTextView mTextView = (AutoCompleteTextView) findViewById(R.id.location);  mTextView.setAdapter(adapter); mTextView.setKeyListener(null); mTextView.setOnTouchListener(new View.OnTouchListener(){     @Override     public boolean onTouch(View v, MotionEvent event){         ((AutoCompleteTextView) v).showDropDown();         return false;     } }); 
like image 42
Sidney Veiga Avatar answered Oct 02 '22 17:10

Sidney Veiga