You can trick by wrapping the widget class. Change the TypeFace
when widget attached to window.
Tip: Calligraphy
library included helper class for TypeFace
. You can generate TypeFace
based on AssetManager
and path to font in assets directory.
For example, I will apply custom font for CollapsingToolbarLayout
class:
class CollapsingToolbarLayoutWrapper : CollapsingToolbarLayout {
// Required constructors
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun onAttachedToWindow() {
super.onAttachedToWindow()
try {
val applicationContext = this.context.applicationContext
val assetManager = applicationContext.assets
val fontBold = applicationContext.getString(R.string.font_default_bold)
this.setCollapsedTitleTypeface(TypefaceUtils.load(assetManager, fontBold))
this.setExpandedTitleTypeface(TypefaceUtils.load(assetManager, fontBold))
} catch (exception: Exception) {
// Maybe exceptions from typeface, like missing font in assets, for font is not accept,...
}
}
}
And in layout xml file, use CollapsingToolbarLayoutWrapper
instead:
<android.support.design.widget.CoordinatorLayout>
<!-- ... -->
<android.support.design.widget.AppBarLayout>
<!-- ... -->
<....CollapsingToolbarLayoutWrapper
app:layout_scrollFlags="scroll|enterAlwaysCollapsed"
app:collapsedTitleGravity="center"
<!-- (optional) If you need to change title text size for collapsed/expanded states, can change attributes app:collapsedTitleTextAppearance, app:expandedTitleTextAppearance -->
app:collapsedTitleTextAppearance="@style/AppTheme.Widget.Style.Toolbar.TextAppearance.Title"
app:expandedTitleTextAppearance="@style/AppTheme.Widget.Style.Toolbar.TextAppearance.Title.Expanded"
app:expandedTitleGravity="start|bottom"
app:expandedTitleMarginStart="32dp">
<android.support.v7.widget.Toolbar>
<!-- ... -->
</android.support.v7.widget.Toolbar>
</....CollapsingToolbarLayoutWrapper>
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
Result
