通过书法将字体设置为应用程序

时间:2015-08-19 10:11:13

标签: android android-activity

我将我的UI部分分成了一个lib,并在那里创建我的样式。

我有一个所有按钮的默认样式,我就是这样设置的。

<style name="MyTheme.Default">
     <item name="buttonStyle">@style/button</item>
</style>

我的按钮样式是

<style name="button">
    <item name="fontPath">fonts/myfont.ttf</item>
    <item name="android:gravity">center</item>
    <item name="android:clickable">true</item>
    <item name="android:textSize">14sp</item>
</style>

我想在不调用@style属性的情况下将此按钮样式应用于所有按钮。除了字体外,一切似乎都能正常工作。它没有得到应用。

如果我使用@style属性调用,它似乎应用了字体。

我可以使用textAppearance为应用程序中的所有文本应用字体,这也会更改我的按钮的字体。但这是我不想要的行为。

那么,如何在不使用每个按钮的@style属性的情况下,通过我的lib将按钮应用于按钮。

3 个答案:

答案 0 :(得分:6)

我无法完全记住,但如果AppCompat在Class Path上,我们不会将默认样式输入到Calligraphy中。您可能需要这样做:

new CalligraphyConfig.Builder().setDefaultFontPath("fonts/Roboto-Light.ttf")
        .addCustomStyle(AppCompatButton.class, R.attr.buttonStyle)
        .setFontAttrId(R.attr.fontPath)
        .build());

注意这一行:

.addCustomStyle(AppCompatButton.class, R.attr.buttonStyle)

这将告诉Calligraphy默认使用buttonStyle作为AppCompatButton。然后你可以使用:

<style name="MyTheme.Default">
     <item name="buttonStyle">@style/button</item>
</style>

答案 1 :(得分:3)

我认为我发现了这个问题。如果您使用的是AppCompat,则字体不会应用于某些小部件,例如Button,因为AppComat在充气时会用AppCompat版本替换组件(例如Button ---&gt; AppCompatButton)。

所以你不能只使用xml来做。使用Java的一种可能方式是:

private void changeFont(ViewGroup layout) {//Where 'layout' is the parent
    for (int i = 0; i < layout.getChildCount(); i++) {
        View child = layout.getChildAt(i);
        if (child instanceof ViewGroup) {
            changeFont((ViewGroup) child);
        } else if (child instanceof Button) {
            child.setTypeface(...//The font that you want
        }
    }
}

另一种选择,如果您的minSDK&gt; 16避免使用AppCompat。我没有尝试this,但它可以运作

希望这会对你有所帮助。

答案 2 :(得分:0)

我发现纯粹基于主题的解决方案(使用库的2.2.0版本):

<强> styles.xml

提升按钮

<style name="YourAppTheme" parent="Theme.AppCompat">
    <item name="android:buttonStyle">@style/RaisedButton</item>
</style>

<style name="RaisedButton" parent="Widget.AppCompat.Button.Colored">
    <item name="fontPath">fonts/Roboto-Medium.ttf</item>
    <!-- extras -->
    <item name="android:textAppearance">@style/TextAppearanceButtonColored</item>
</style>

<style name="TextAppearanceButtonColored" parent="TextAppearance.AppCompat.Widget.Button">
    <item name="android:textColor">@color/btn_text_selector</item>
</style>

平面按钮

<style name="YourAppTheme" parent="Theme.AppCompat">
    <item name="android:textAppearanceButton">@style/TextAppearanceButtonBorderless</item>
</style>

<style name="TextAppearanceButtonBorderless" parent="TextAppearance.AppCompat.Widget.Button">
    <item name="fontPath">fonts/Roboto-Medium.ttf</item>
    <!-- extras -->
    <item name="android:textColor">@color/btn_borderless_text_selector</item>
</style>

所以&#34; fontPath&#34;平面和凸起按钮的参数应写入。