更改单选按钮旁文本的字体?

21

为了更改textView的字体,我使用了以下代码:

TextView tv = (TextView) findViewById(R.id.textview);
Typeface font = Typeface.createFromAsset(getAssets(), "SF_Cartoonist_Hand_Bold.ttf");
tv.setTypeface(font);

我想对单选按钮旁边的文本进行类似操作,该如何操作?


3
一样的吧?RadioButton 有一个 setTypeface() 方法。 - Piovezan
5个回答

29

您设置与 RadioButton 相邻的文本字体的方式与 TextView 相同:

RadioButton rb  = (RadioButton) findViewById(R.id.radiobutton);
Typeface font = Typeface.createFromAsset(getAssets(), "SF_Cartoonist_Hand_Bold.ttf");
rb.setTypeface(font);

2

我个人喜欢在片段或活动之外处理样式。以下CustomRadioButton类应该可以解决这个问题。

XML布局:

<com.company.package.ui.CustomRadioButton
    android:id="@+id/radioBtnAge"
    style="@style/RadioButton.One"
    app:fontName="SF-Pro-Text-Medium.otf"/>

CustomRadioButton���:

package com.company.package.ui;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;

public class CustomRadioButton extends android.support.v7.widget.AppCompatRadioButton {
    public CustomRadioButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs);
    }

    public CustomRadioButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs);

    }

    public CustomRadioButton(Context context) {
        super(context);
        init(null);
    }

private void init(AttributeSet attrs) {
    if (attrs != null) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CustomTextView);
        String fontName = a.getString(R.styleable.CustomTextView_fontName);

        if (fontName == null || fontName.isEmpty()) {
            fontName = FontCacheHelper.DEFAULT_FONT_NAME;
        }

        Typeface myTypeface = FontCacheHelper.getInstance().getAppFont(getContext(), fontName);
        setTypeface(myTypeface);
        a.recycle();
    }
}
}

FontCacheHelper 可以有效管理字体(参考:https://slothdevelopers.wordpress.com/2014/05/11/custom-fonts-in-textview-and-fontcache/

package com.company.package.util;

import android.content.Context;
import android.graphics.Typeface;
import android.support.annotation.NonNull;

import java.util.HashMap;
import java.util.Map;

public class FontCacheHelper {
    private static final String FEATURE_FONT_PATH = "Fonts/";
    private static final String APP_FONT_PATH = "Fonts/App/";
    public static final String DEFAULT_FONT_NAME = "SF-Pro-Text-Medium.otf";
    private static FontCacheHelper fontCacheHelper;
    private Map<String, Typeface> fontMap = new HashMap<>();

    public static FontCacheHelper getInstance() {
        if (fontCacheHelper == null) {
            fontCacheHelper = new FontCacheHelper();
        }
        return fontCacheHelper;
    }

    public
    @NonNull
    Typeface getAppFont(@NonNull Context context, @NonNull String fontName) {
        String fontPath = getAppFontFilePath(fontName); 
        return getFontByPath(context, fontPath);
    }

    public
    @NonNull
    Typeface getFeatureFont(@NonNull Context context, @NonNull String fontName) {
        String fontPath = getFeatureFontFilePath(fontName);
        return getFontByPath(context, fontPath);
    }

    public
    @NonNull
    Typeface getFontByPath(@NonNull Context context, @NonNull String fontPath) {
        if (fontMap.containsKey(fontPath)) {
            return fontMap.get(fontPath);
        } else {
            Typeface typeface;
            if (fontPath.isEmpty()) {
                typeface = Typeface.DEFAULT;
            } else {
                typeface = Typeface.createFromAsset(context.getAssets(), fontPath);
                if (typeface == null) {
                    typeface = Typeface.DEFAULT;
                }
            }
            fontMap.put(fontPath, typeface);
            return typeface;
        }
    }

    public
    @NonNull
    String getDefaultFontFilePath() {
        return APP_FONT_PATH + DEFAULT_FONT_NAME;
    }

    private
    @NonNull
    String getAppFontFilePath(@NonNull String fontName) {
        return APP_FONT_PATH + fontName;
    }

    private
    @NonNull
    String getFeatureFontFilePath(@NonNull String fontName) {
        return FEATURE_FONT_PATH + fontName;
    }

    public
    @NonNull
    String getFontName(@NonNull Typeface typeface) {
        for (Map.Entry<String, Typeface> entry : fontMap.entrySet()) {
            if (entry.getValue().equals(typeface)) {
                return entry.getKey();
            }
        }
        return "";
    }
}

2

来自官方文档:

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

调用所需的API 26。对于小于26的情况怎么办? - roghayeh hosseini

2
在Kotlin中,您可以以编程方式更改单选按钮的字体。
val typeface =ResourcesCompat.getFont(context, R.font.myfont) 
radioButton.typeface= typeface

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接