Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set font custom font to Spinner text programmatically?

I have a ttf font file in my assets folder. I know how to use it for textviews with:

Typeface externalFont=Typeface.createFromAsset(getAssets(), "fonts/HelveticaNeueLTCom-Lt.ttf"); textview1.setTypeface(externalFont); 

I have defined look for my spinner text in it's own xml file (as usuall in android):

<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android"  android:id="@+android:id/text1" style="?android:attr/spinnerItemStyle" android:singleLine="true" android:textColor="#ffffff" android:gravity="center"  android:layout_width="fill_parent" android:layout_height="wrap_content" android:ellipsize="marquee" /> 

I just can't reference this textview from code, i always get null pointer exceptions. E.g. i tried:

TextView spinner_text=(TextView)findViewById(R.id.text1); spinner_text.setTypeface(externalFont); 

Is it possible to select my external font even for my spinner text defined in it's own xml?

Thank you.

EDIT with answer:

This works:

String [] items = new String[2];     items[0]="Something1";     items[1]="Something2";  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,                     R.layout.spinaca, items) {           public View getView(int position, View convertView, ViewGroup parent) {                  View v = super.getView(position, convertView, parent);                   Typeface externalFont=Typeface.createFromAsset(getAssets(), "fonts/HelveticaNeueLTCom-Lt.ttf");                  ((TextView) v).setTypeface(externalFont);                   return v;          }            public View getDropDownView(int position,  View convertView,  ViewGroup parent) {                   View v =super.getDropDownView(position, convertView, parent);                   Typeface externalFont=Typeface.createFromAsset(getAssets(), "fonts/HelveticaNeueLTCom-Lt.ttf");                  ((TextView) v).setTypeface(externalFont);                  v.setBackgroundColor(Color.GREEN);                   return v;          }  };        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);                                       spinner.setAdapter(adapter); 

It may be necessary to add

import android.view.ViewGroup; 

To your list of imports at the top of your file. For some reason Eclipse doesn't make this suggestion when it doesn't recognize the ViewGroup class involved in the code.

like image 655
DixieFlatline Avatar asked Mar 30 '11 07:03

DixieFlatline


People also ask

How to set custom font for spinner in android?

TextView spinner_text=(TextView)findViewById(R. id. text1); spinner_text. setTypeface(externalFont);

How do I change the font of the spinner family?

In summary to change the text size (or other style attributes) for a Spinner either: Create a custom TextView layout. Change the text size with the android:textSize attribute. Change the text color with android:textColor.


2 Answers

This is what worked for me (using ideas both from CommonsWare's and gsanllorente's answers):

private static class MySpinnerAdapter extends ArrayAdapter<String> {     // Initialise custom font, for example:     Typeface font = Typeface.createFromAsset(getContext().getAssets(),                         "fonts/Blambot.otf");      // (In reality I used a manager which caches the Typeface objects)     // Typeface font = FontManager.getInstance().getFont(getContext(), BLAMBOT);      private MySpinnerAdapter(Context context, int resource, List<String> items) {         super(context, resource, items);     }      // Affects default (closed) state of the spinner     @Override     public View getView(int position, View convertView, ViewGroup parent) {         TextView view = (TextView) super.getView(position, convertView, parent);         view.setTypeface(font);         return view;     }      // Affects opened state of the spinner     @Override     public View getDropDownView(int position, View convertView, ViewGroup parent) {         TextView view = (TextView) super.getDropDownView(position, convertView, parent);         view.setTypeface(font);         return view;     } } 

If you, like me, originally populated the Spinner using ArrayAdapter.createFromResource() and an array resource (as in Spinner documentation), then you'd use MySpinnerAdapter like this:

MySpinnerAdapter<String> adapter = new MySpinnerAdapter(         getContext(),         R.layout.view_spinner_item,         Arrays.asList(getResources().getStringArray(R.array.my_array)) ); spinner.setAdapter(adapter); 
like image 199
Jonik Avatar answered Oct 13 '22 11:10

Jonik


You would apply the font through your own custom SpinnerAdapter, in getView() and getDropDownView().

like image 36
CommonsWare Avatar answered Oct 13 '22 10:10

CommonsWare