Tobias Moe Thorstensen
Tobias Moe Thorstensen

Reputation: 8981

Setting Roboto font in TextView - xml

I've found several posts regarding this topic, but all of this topics either sets the font with setTypeFace() method on a TextView object, or creating a custom class which sets the font to Roboto and extends TextView. As far as I know from API-Level 11(?) or something, we are able to set the TypeFace as a xml attribute, some how. Like this:

   <TextView
      android:id="@+id/profileHeader"
      android:layout_width="100dp"
      android:layout_height="100dp"
      android:typeface="roboto"
      android:text="Hello, world">
   </TextView>

What is the right way to do this? Is it possible to have a fallback if the application runs on a device lower than API level 11(?) something like:

 android:typeface="roboto|monospace|serif"

Upvotes: 17

Views: 20251

Answers (6)

hafridi
hafridi

Reputation: 278

This is for future people running in to the same issue as I have. Setting typeface tends to take up lot of memory when it comes to loading multiple rows. Using the following two codes together to actually make it work smoothly. I got the solution from stackoverflow but they answers were not listed together.

public class RobotoTextView extends TextView {

Context context;

public RobotoTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
}

public RobotoTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
}

public RobotoTextView(Context context) {
    super(context);
    this.context = context;
}

public void setTypeface(Typeface tf, int style) {
    if (!isInEditMode()) {
        if (style == Typeface.NORMAL) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-Light.ttf"));
        } else if (style == Typeface.ITALIC) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-LightItalic.ttf"));
        } else if (style == Typeface.BOLD) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-Bold.ttf"));
        } else if (style == Typeface.BOLD_ITALIC) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-BoldItalic.ttf"));
        }

    }
}



public class TypeFaceProvider {

private static Hashtable<String, Typeface> sTypeFaces = new Hashtable<String, Typeface>(
        4);

public static Typeface getTypeFace(Context context, String fileName) {
    Typeface tempTypeface = sTypeFaces.get(fileName);

    if (tempTypeface == null) {
        tempTypeface = Typeface.createFromAsset(context.getAssets(),
                fileName);
        sTypeFaces.put(fileName, tempTypeface);
    }

    return tempTypeface;
}
}

Upvotes: 1

cnnr
cnnr

Reputation: 1636

Take a look at the RobotoTextView project. Works down to Android 1.5, and you can set the typeface using XML attributes. It also includes other views like RobotoButton, RobotoCheckbox, etc.

Upvotes: 6

apenasVB
apenasVB

Reputation: 1463

For JellyBean (4.1) onward you can use the method provided in this StackOverflow topic. It will fallback gracefully to sans in older devices. If you must fallback to monospace or serif, declare a folder layout-v16 where you use the font you chose, i.e., "sans-serif-condensed", and in the default folder you use the "monospace" or "serif" font. If you want to fallback to a non-default font, you can programatically check the android version and choose the appropriate action, i.e.:

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
    TextView textView = (TextView) findViewById(R.id.textView_id);
    Typeface myFont = Typeface.createFromAsset(getAssets(),"RobotoCondensed.ttf");
    textView.setTypeface(myFont);
}

Upvotes: 1

Alex Fu
Alex Fu

Reputation: 5529

The android:typeface attribute only has a few valid options (according to the Android docs)...

  • normal
  • sans
  • serif
  • monospace

If you need the Roboto font in your app for older devices, you need to include the Roboto TTF files into your project.

The most obvious way to use these fonts is to use the setTypeface() method of TextView, but if you want to specify it in XML instead, you must create a custom TextView and create your own styleable attribute for your custom TextView.

This topic is all over the Internet.

Upvotes: 1

sachin
sachin

Reputation: 29

You can not set font directly from assets like this you have to do as follow in onCreate. This will make same thing what you want to do.

TextView tvTextView = (TextView) findViewById(R.id.textView1);
Typeface typeface = Typeface.createFromAsset(getAssets(),"Roboto.ttf");
tvTextView.setTypeface(typeface);

Hope it will help you out.:D

Upvotes: 1

Vikram Gupta
Vikram Gupta

Reputation: 6516

I don't see a way you can define an external typeface as a xml attribute. You should store the typeface in the assets and call:

tv.setTypeface( Typeface.createFromAsset( context.getAssets(), roboto.ttf ) );

Upvotes: 1

Related Questions