9

我想说我在设置 textview 字体时遇到了一个奇怪的问题。如果我从设置-> 显示更改设备字体样式,那么 textview 字体样式也会更改。我怎样才能防止这种情况?

这是我的 xml 布局中的文本视图。

<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"

此外,它在三星 Galaxy Grand、三星 Note 2 等设备上也能正常工作。但在三星 Note 8、三星 Note 10.1 等设备上却不能正常工作。

有没有其他方法可以做到这一点?

谢谢

4

4 回答 4

6

fontFamilytypeface属性与android原生字体有关。如果您希望TextViews无论设备字体设置如何,您的字体始终相同,则需要以编程方式设置自定义Typeface.

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

附带说明一下,Calligraphy项目可以直接从布局 xml 中实际设置自定义字体。

于 2013-10-09T09:45:42.403 回答
0
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
                                                                                                                 */);
        }
    }

}

并像这样将其添加到您的 xml 中

    <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"/>
于 2013-10-09T10:52:14.440 回答
0

这在 kotlin 中对我有用:

textView.typeface = ResourcesCompat.getFont(this, R.font.opensans_light)
于 2020-06-15T11:37:06.103 回答
0

试试这个,它对我有用......

@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;
}

注意:添加android:configChanges="fontScale"到清单<activity>

于 2021-06-16T16:46:20.413 回答