字体在Android Studio预览中更改,但在模拟器/设备中不会更改

时间:2018-02-13 05:29:06

标签: android android-studio fonts textview

我正在尝试更改textviews,checkbox,buttons和android.support.design.widget.TextInputLayout的默认字体。为了清楚说明,我设置了“android:fontFamily”> cursive<。

它似乎在Android Studio预览中正确显示,但未在模拟器中显示,如下所示。另请注意,密码(提示)似乎在两者中都不起作用。非常感谢您的帮助,以突出为何会发生这种情况。

enter image description here

styles.xml:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:textColor">#ed328b</item>
    <item name="android:titleTextColor">#ed328b</item>
    <item name="android:textSize">14sp</item>
    <item name="android:fontFamily">cursive</item>
</style>

<style name="TextLabel" parent="Widget.Design.TextInputLayout">
    <!-- Hint color and label color in FALSE state -->
    <item name="android:textColorHint">#ed328b</item>
    <item name="android:textSize">14sp</item>
    <!-- Label color in TRUE state and bar color FALSE and TRUE State -->
    <item name="colorAccent">#ed328b</item>
    <item name="android:textColor">#ed328b</item>
    <item name="colorControlNormal">#ed328b</item>
    <item name="colorControlActivated">#ed328b</item>
    <item name="android:textColorSecondary">#ed328b</item>
    <item name="android:textColorPrimary">#ed328b</item>
    <item name="android:fontFamily">cursive</item>
</style>

activity_main.xml中:

<android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/TextLabel"
            android:layout_marginTop="@dimen/space_2">
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:inputType="textEmailAddress"
                android:hint="@string/signin_emailaddress"
                android:id="@+id/txtEmail" />
        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/TextLabel"
            android:layout_marginTop="@dimen/space_2">
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:inputType="textPassword"
                android:hint="@string/signin_password"
                android:id="@+id/txtPassword" />
        </android.support.design.widget.TextInputLayout>

        <CheckBox
            android:id="@+id/rememberBox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:layout_gravity="start"
            android:text="remember my email and password"
            android:textAlignment="center"
            android:textColor="#ed328b"
            android:textSize="11dp" />

4 个答案:

答案 0 :(得分:2)

Android没有内置支持通过XML将自定义字体直接应用于文本小部件。

您可以参考此文档在xml中设置字体:https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

或者您需要在java代码中设置字体才能更改字体。

或者你可以这样做:

<强>第一

您需要定义自己的样式。在/ res / values文件夹中,打开/创建attrs.xml文件并添加一个声明样式的对象,如下所示:

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

<强>第二

假设您经常要使用此窗口小部件,则应为加载的Typeface对象设置一个简单缓存,因为动态加载它们可能需要一些时间。类似的东西:

public class FontManager {
    private static FontManager instance;

    private AssetManager mgr;

    private Map<String, Typeface> fonts;

    private FontManager(AssetManager _mgr) {
        mgr = _mgr;
        fonts = new HashMap<String, Typeface>();
    }

    public static void init(AssetManager mgr) {
        instance = new FontManager(mgr);
    }

    public static FontManager getInstance() {
        if (instance == null) {
            // App.getContext() is just one way to get a Context here
            // getContext() is just a method in an Application subclass
            // that returns the application context
            AssetManager assetManager = App.getContext().getAssets();
            init(assetManager);
        }
        return instance;
    }

    public Typeface getFont(String asset) {
        if (fonts.containsKey(asset))
            return fonts.get(asset);

        Typeface font = null;

        try {
            font = Typeface.createFromAsset(mgr, asset);
            fonts.put(asset, font);
        } catch (Exception e) {

        }

        if (font == null) {
            try {
                String fixedAsset = fixAssetFilename(asset);
                font = Typeface.createFromAsset(mgr, fixedAsset);
                fonts.put(asset, font);
                fonts.put(fixedAsset, font);
            } catch (Exception e) {

            }
        }

        return font;
    }

    private String fixAssetFilename(String asset) {
        // Empty font filename?
        // Just return it. We can't help.
        if (TextUtils.isEmpty(asset))
            return asset;

        // Make sure that the font ends in '.ttf' or '.ttc'
        if ((!asset.endsWith(".ttf")) && (!asset.endsWith(".ttc")))
            asset = String.format("%s.ttf", asset);

        return asset;
    }
}

这个允许你使用.ttc文件扩展名,但它没有经过测试。

<强>第三

创建一个子类TextView的新类。此特定示例考虑了已定义的XML字体(粗体,斜体等)并将其应用于字体(假设您使用的是.ttc文件)。

/**
 * TextView subclass which allows the user to define a truetype font file to use as the view's typeface.
 */
public class FontText extends TextView {
    public FontText(Context context) {
        this(context, null);
    }

    public FontText(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public FontText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        if (isInEditMode())
            return;

        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.FontText);

        if (ta != null) {
            String fontAsset = ta.getString(R.styleable.FontText_typefaceAsset);

            if (!TextUtils.isEmpty(fontAsset)) {
                Typeface tf = FontManager.getInstance().getFont(fontAsset);
                int style = Typeface.NORMAL;
                float size = getTextSize();

                if (getTypeface() != null)
                    style = getTypeface().getStyle();

                if (tf != null)
                    setTypeface(tf, style);
                else
                    Log.d("FontText", String.format("Could not create a font from asset: %s", fontAsset));
            }
        }
    }
}

最后终于

使用完全限定的类名替换XML中的TextView实例。像Android命名空间一样声明自定义命名空间。请注意,“typefaceAsset”应指向/ assets目录中包含的.ttf或.ttc文件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.FontText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is a custom font text"
        custom:typefaceAsset="fonts/AvenirNext-Regular.ttf"/>
</RelativeLayout>

答案 1 :(得分:2)

在Android Studio中选择字体时,只需选中“将字体添加到项目”框,而不是选择“创建可下载的字体”。

您的问题将得到解决。

Android Resources Window

答案 2 :(得分:1)

确保“ super.onCreate(savedInstanceState)”位于第一行。

 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
 }

如果您以错误的顺序放置行。例如:

 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
    setContentView(R.layout.activity);
    super.onCreate(savedInstanceState);
 }

...,然后Android Studio预览将正确显示字体,但在模拟器/设备中将失败。

答案 3 :(得分:0)

尝试

editText.setTypeface(Typeface.SERIF);

// Create a TypeFace using font from Assets folder 

Typeface mtypeFace = Typeface.createFromAsset(getAssets(),

              "fonts/MyFont.ttf");
              // set TypeFace to the TextView or Edittext
              tvText.setTypeface(mtypeFace);

或XML

android:fontFamily="@font/yourfont"

source here