我需要自定义Font和TextView的帮助

时间:2018-09-24 03:21:52

标签: android fonts textview

我是android的新手,正在开发一个可为用户提供有关Google所有字体的信息的应用程序。 为此,我需要使用TextView Something like this

制作一个应用

单击TextView时,字体将随文本更改。

我正在考虑使用onclicklistener

3 个答案:

答案 0 :(得分:1)

您可以将"your_font.ttf"文件放在资产文件夹中,然后使用

导入
Typeface custom_font_1 = Typeface.createFromAsset(getAssets(),  "your_font.ttf");

然后使用此

将其分配给您的showCaseTextView
   showCaseTextView.setTypeFace(custom_font_1);

然后在onClickListener的{​​{1}}中更改您的showCaseTextView字体

specifiedTextView

,并重复其他字体。

答案 1 :(得分:0)

有2种存档方式

第一种方法

public class FontCache {

    private static HashMap<String, Typeface> fontCache = new HashMap<>();

    public static Typeface getTypeface(String fontname, Context context) {
        Typeface typeface = fontCache.get(fontname);

        if (typeface == null) {
            try {
                typeface = Typeface.createFromAsset(context.getAssets(), fontname);
            } catch (Exception e) {
                return null;
            }

            fontCache.put(fontname, typeface);
        }

        return typeface;
    }
}

这会在最大程度减少对资产的访问次数的同时缓存字体。现在,由于我们有了访问自定义字体的方法,因此我们实现一个扩展TextView的类。

扩展TextView 接下来,我们将创建一个新的Java类,该类将扩展TextView。这使我们可以在所有XML视图中使用该类。它继承了常规TextView的所有功能和属性;但是添加了我们的自定义字体。

再一次,我们来看看我们的美食项目的源代码。该代码可能看起来很复杂,但很简单:

public class EatFoodyTextView extends TextView {

    public EatFoodyTextView(Context context) {
        super(context);

        applyCustomFont(context);
    }

    public EatFoodyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);

        applyCustomFont(context);
    }

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

        applyCustomFont(context);
    }

    private void applyCustomFont(Context context) {
        Typeface customFont = FontCache.getTypeface("SourceSansPro-Regular.ttf", context);
        setTypeface(customFont);
    }
}

前三个方法只是构造函数,我们将其重写以调用单个方法applyCustomFont()。该方法是难题的重要组成部分。它只是从FontCache类中获取(希望缓存的)字体。最后,我们必须用字体调用setTypeface(),我们差不多完成了。如果您想知道,我们可以直接调用setTypeface()(而不是在TextView对象上),因为我们正在扩展TextView类。

使用课程 您可能想知道,是否值得进行如此大量的准备。在本节中,您将看到确实如此。因为您要做的就是在XML视图中使用该类,并且该类会自动具有您的自定义字体。不需要Java代码!

<RelativeLayout  
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.futurestudio.foody.views.EatFoodyTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/eat_foody_green_dark"
        android:textSize="20sp"
        android:text="Future Studio Blog"
        android:layout_marginBottom="24dp"/>

</RelativeLayout>  

如您所见,您可以继续使用TextView的所有功能(例如textSize,textColor)。现在,将所有元素替换为我们刚刚创建的类,例如,您将自定义字体应用到了所有地方! (参考:https://futurestud.io/tutorials/custom-fonts-on-android-extending-textview

第二种方式 遵循来自API 26(Android 8)https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml

的Google指南支持

在textview之间进行更改以更改字体

<RelativeLayout  
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textview_normal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/eat_foody_green_dark"
        android:textSize="20sp"
        android:text="Future Studio Blog"
        android:layout_marginBottom="24dp"/>
    <com.futurestudio.foody.views.EatFoodyTextView
        android:id="@+id/textview_custom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/eat_foody_green_dark"
        android:textSize="20sp"
        android:text="Future Studio Blog"
        android:visibility="gone"
        android:layout_marginBottom="24dp"/>

</RelativeLayout> 

注意android:visibility="gone" 在“活动”中,您可以使用此代码在2个TextView之间进行切换

    final TextView normalTextView = findViewById(R.id.textview_normal);
    final TextView customTextView = findViewById(R.id.textview_custom);

    normalTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            normalTextView.setVisibility(View.GONE);
            customTextView.setVisibility(View.VISIBLE);
        }
    });

    customTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            normalTextView.setVisibility(View.VISIBLE);
            customTextView.setVisibility(View.GONE);
        }
    });

答案 2 :(得分:0)

您可以使用android属性通过TextView,EditText,Button等实现自己的自定义字体。

操作方法

-以下是一些使用步骤:

1。创建属性文件(res-> values-> attrs.xml)

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <declare-styleable name="TextElement">
        <attr name="font" format="string"/>
        <attr name="underline" format="boolean"/>
    </declare-styleable>
</resources>

2。创建自定义TextView类(在Java文件夹中的任何位置) 3.在布局文件中使用属性 4.然后运行您的代码。

这是您问题的完整示例,您可以阅读以下示例:

Full Demonstration