Question

I would like say that I have a strange problem in setting textview font. If I change the Device font style from setting-> display, then textview font style also get changed. How can i prevent this?

Here is my textview in my xml layout.

<TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/title_bar_bg"
        android:fontFamily="sans-serif"
        android:typeface="sans"
        android:gravity="center"
        android:text="@string/people_finder"
        android:textColor="@color/WHITE"
        android:textSize="18sp"
        android:textStyle="bold"/>

android:fontFamily="sans-serif" android:typeface="sans"

Also It is working fine in some device like Samsung Galaxy Grand, Samsung Note 2. But not working in Samsung Note 8, Samsung Note 10.1 etc.

is there any other way to do this?

Thanks

Was it helpful?

Solution

fontFamily and typeface attributes are related to android native fonts. If you want your TextViews font to be always the same regardless the device font settings, you need to programmatically set a custom Typeface.

Typeface tf = Typeface.createFromAsset(context.getAssets(), "fontName.ttf"));
TextView textView = (TextView) findViewById(R.id.textView1);
textView.setTypeface(tf);

As a side note, Calligraphy project enables actually setting custom font directly from a layout xml.

OTHER TIPS

public class CustomTextView extends TextView {

    Context context;

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

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

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

    public void setTypeface(Typeface tf, int style) {
        if (style == Typeface.NORMAL) {
            super.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/HelveticaNeue.ttf")/*
                                                                                                             * ,
                                                                                                             * -
                                                                                                             * 1
                                                                                                             */);
        } else if (style == Typeface.ITALIC) {
            super.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/HelveticaNeueItalic.ttf")/*
                                                                                                                 * ,
                                                                                                                 * -
                                                                                                                 * 1
                                                                                                                 */);
        } else if (style == Typeface.BOLD) {
            super.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/HelveticaNeueBold.ttf")/*
                                                                                                                 * ,
                                                                                                                 * -
                                                                                                                 * 1
                                                                                                                 */);
        }
    }

}

and add it in ur xml like this

    <xxx.xxxx.utils.CustomTextView 
        android:id="@+id/login_username_tv"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_weight="0.3"
        android:text="Email"
        android:padding="5dp"
        android:textColor="#333333" 
        android:textSize="12dp"/>

This worked for me in kotlin:

textView.typeface = ResourcesCompat.getFont(this, R.font.opensans_light)

Try this, it worked for me...

@Override
public void onConfigurationChanged(Configuration newConfig) {
    if (newConfig.fontScale != 1)
        getResources();
    super.onConfigurationChanged(newConfig);
}

@Override
public Resources getResources() {
    Resources res = super.getResources();
    Configuration newConfig = new Configuration();
    newConfig.setToDefaults();      //Setting the default (1.0f)
    res.updateConfiguration(newConfig, res.getDisplayMetrics());
    
    return res;
}

Note: Add android:configChanges="fontScale" to the Manifest <activity>

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top