Android自定义样式继承
我有一个可定制主题的应用程序。用户当前可以在3个主题之间切换,每个主题都可以更改主显示区域的背景色、字体颜色和字体,但不能更改按钮或其他小部件。由于没有一种很好的方法来指定主题中的自定义字体,我的应用程序代码在重置主题的同时(使用Android自定义样式继承,android,xml,xamarin,fonts,themes,Android,Xml,Xamarin,Fonts,Themes,我有一个可定制主题的应用程序。用户当前可以在3个主题之间切换,每个主题都可以更改主显示区域的背景色、字体颜色和字体,但不能更改按钮或其他小部件。由于没有一种很好的方法来指定主题中的自定义字体,我的应用程序代码在重置主题的同时(使用SetTheme)切换字体(使用typeface.CreateFromAsset和TextView.typeface)。(我相信非Xamarin版本的字体是Typeface.createFromAsset,TextView.setTypeface和setTheme,顺便
SetTheme
)切换字体(使用typeface.CreateFromAsset
和TextView.typeface
)。(我相信非Xamarin版本的字体是Typeface.createFromAsset
,TextView.setTypeface
和setTheme
,顺便说一句)但我注意到,与其他字体相比,这种别致的字体看起来更小,所以每当我使用该主题时,我都希望字体更大。因此,我创建了以下主题,它继承了我的主主题:
<style name="Theme.StoryvoqueFancy" parent="@style/Theme.StoryvoqueLight">
<item name="android:textSize">18sp</item>
<item name="android:lineSpacingExtra">5sp</item>
<item name="android:textColorTertiary">#000000</item>
</style>
18便士
5便士
#000000
textSize属性实现了我希望它与主文本的匹配,使其更大。我搞不懂的是如何安排我的属性或样式,使其不影响其他文本。请注意,在我下面的截图中,当我使用这个主题时,按钮文本也变得越来越大
默认主题
花式主题
理想情况下,我想我希望主题能够指定仅适用于主视图的属性,例如:
<item name="mainViewTextSize">18sp</item>
18sp
然后我会从我的TextView中引用mainViewTextSize。或者我想使用:
<item name="textSizeTertiary">18sp</item>
18sp
因为textColor似乎会影响主视图中的文本,但不会影响按钮。但不存在这样的属性
我不确定这是否可行,或者我是否从错误的方向来处理此问题。可以将文件
attrs.xml
添加到Resources\values\
目录中,内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<attr name="mainViewTextSize" format="dimension"/>
</resources>
<style name="Theme.StoryvoqueFancy" parent="@style/Theme.StoryvoqueLight">
<item name="mainViewTextSize">18sp</item>
<item name="android:textColorTertiary">#000000</item>
</style>
<TextView
android:id="@+id/descriptionText"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textSize="?mainViewTextSize" />
我的axml文件包含以下内容:
<TextView
android:id="@+id/descriptionText"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textAppearance="?mainViewStyle"
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<attr name="mainViewStyle" format="reference"/>
</resources>
可以使用以下内容将文件attrs.xml
添加到Resources\values\
目录中:
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<attr name="mainViewTextSize" format="dimension"/>
</resources>
<style name="Theme.StoryvoqueFancy" parent="@style/Theme.StoryvoqueLight">
<item name="mainViewTextSize">18sp</item>
<item name="android:textColorTertiary">#000000</item>
</style>
<TextView
android:id="@+id/descriptionText"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textSize="?mainViewTextSize" />
我的axml文件包含以下内容:
<TextView
android:id="@+id/descriptionText"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textAppearance="?mainViewStyle"
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<attr name="mainViewStyle" format="reference"/>
</resources>
鉴于主题是全局的而样式是局部的,您可能希望创建应用于视图
级别而不是全局的特定样式
因此,您应该定义一个文本外观
,您的样式将继承并最终应用于您的视图
。如果您需要对样式进行任何自定义,您可以创建。鉴于主题是全局的而样式是局部的,您需要创建应用于视图
级别而不是全局的特定样式
因此,您应该定义一个文本外观
,您的样式将继承并最终应用于您的视图
。如果您需要对样式进行任何自定义,您可以创建。我允许用户选择应影响全局外观的备用全局样式。但是,当他们选择花式样式时,我需要细化在一个特定视图上发生的情况,因为我只希望在该样式处于活动状态时,将大小和行距应用于一个视图。我不清楚你的回答是否解决了这个问题——如果是的话,我可能需要更多的细节。我想,我有点理解了你的建议,并将其添加到我的回答中。我有点不确定lineSpacingExtra的位置。但一切看起来都和我想要的差不多。不过,如果我遗漏了你的部分观点,我愿意进行改进。这与我的建议非常接近。我允许用户选择其他全局样式,这将影响全局外观。但是,当他们选择花式样式时,我需要细化在一个特定视图上发生的情况,因为我只希望在该样式处于活动状态时,将大小和行距应用于一个视图。我不清楚你的回答是否解决了这个问题——如果是的话,我可能需要更多的细节。我想,我有点理解了你的建议,并将其添加到我的回答中。我有点不确定lineSpacingExtra的位置。但一切看起来都和我想要的差不多。不过,如果我遗漏了你的部分观点,我愿意进行改进。这与我的建议非常接近。