Set specific font in a styles.xml

后端 未结 5 1692
滥情空心
滥情空心 2020-12-01 07:36

I\'m defining a style XML for my android app. I have some TTF files I want to use, how can I set the typeface to use those files as the font as opposed to the generic \"san

相关标签:
5条回答
  • 2020-12-01 08:26

    TextViewPlus.java:

    package com.example;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Typeface;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.widget.TextView;
    
    public class TextViewPlus extends TextView {
        private static final String TAG = "TextView";
    
        public TextViewPlus(Context context) {
            super(context);
        }
    
        public TextViewPlus(Context context, AttributeSet attrs) {
            super(context, attrs);
            setCustomFont(context, attrs);
        }
    
        public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            setCustomFont(context, attrs);
        }
    
        private void setCustomFont(Context ctx, AttributeSet attrs) {
            TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
            String customFont = a.getString(R.styleable.TextViewPlus_customFont);
            setCustomFont(ctx, customFont);
            a.recycle();
        }
    
        public boolean setCustomFont(Context ctx, String asset) {
            Typeface tf = null;
            try {
            tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
            } catch (Exception e) {
                Log.e(TAG, "Could not get typeface: "+e.getMessage());
                return false;
            }
    
            setTypeface(tf);  
            return true;
        }
    
    }
    

    attrs.xml: (in res/values)

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="TextViewPlus">
            <attr name="customFont" format="string"/>
        </declare-styleable>
    </resources>
    

    main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:foo="http://schemas.android.com/apk/res/com.example"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
        <com.example.TextViewPlus
            android:id="@+id/textViewPlus1"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:text="@string/showingOffTheNewTypeface"
            foo:customFont="saxmono.ttf">
        </com.example.TextViewPlus>
    </LinearLayout>
    

    You would put "saxmono.ttf" in the assets folder.

    0 讨论(0)
  • 2020-12-01 08:32

    Yes, you can :)

    step 1: Create a folder and name it 'font' and put your .ttf inside it.

    step 2: Go to style.xml and do the following : -

    step 3: Use the style tag anywhere in views(TextView, TabLayout,..etc.):-

    0 讨论(0)
  • 2020-12-01 08:36
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
            <item name="android:layout_width">fill_parent</item>
            <item name="android:layout_height">wrap_content</item>
            <item name="android:textColor">#00FF00</item>
            <item name="android:typeface">monospace</item>
        </style>
    </resources>
    
    0 讨论(0)
  • 2020-12-01 08:37

    You can only use custom fonts via Java code, not through layout XML or styles/themes -- sorry!

    0 讨论(0)
  • 2020-12-01 08:42

    Create a font dir on resource folder and paste your ttf font file. Then create a font resource XML and paste following lines.

        <?xml version="1.0" encoding="utf-8"?>
    <font-family xmlns:android="http://schemas.android.com/apk/res/android">
        <font
            android:fontStyle="normal"
            android:fontWeight="400"
            android:font="@font/roboto_light" />
        <font
            android:fontStyle="italic"
            android:fontWeight="400"
            android:font="@font/roboto_light_italic" />
    
    </font-family>
    

    Now you can apply font as below. Also note attribute 'textStyle'

      <TextView
                        android:textStyle="italic"
                        android:fontFamily="@font/family_roboto_light"
                        android:textColor="@color/primaryTextColor"
                        android:textSize="20sp"
                        android:gravity="center"
                        android:id="@+id/textView36"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="No Internet connection" />
    
      <TextView
                        android:fontFamily="@font/family_roboto_light"
                        android:textStyle="normal"
                        android:textSize="20sp"
                        android:gravity="center"
                        android:id="@+id/textView37"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="No Internet connection" />
    

    If you want done from code use following, but minimum API level 26

    Typeface typeface = getResources().getFont(R.font. roboto_light_italic);
    textView.setTypeface(typeface);
    

    The Support Library 26.0 provides support to the Fonts in XML feature on devices running Android 4.1 (API level 16) and higher.

    Typeface typeface = ResourcesCompat.getFont(context, R.font. roboto_light_italic);
    
    0 讨论(0)
提交回复
热议问题