我将我的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将按钮应用于按钮。
答案 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;平面和凸起按钮的参数应写入。