XML样式放在哪里

Jon*_*ate 1 android android-theme android-styles android-toolbar

问题1

我希望所有人Toolbar看起来都一样,而无需全部设置样式,因此尽管我会为其设置应用程序主题。我希望所有人拥有的东西之一就是colorControlNormal属性。这些是我的尝试:

代码示例1

<resources>
    <style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="toolbarStyle">@style/MyTheme.ToolbarStyle</item>
    </style>

    <style name="MyTheme.ToolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
        <item name="colorControlNormal">@color/toolbarColorControlNormal</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

代码示例2

<resources>
    <style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorControlNormal">@color/toolbarColorControlNormal</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

代码示例1中,我尝试为Toolbar属性创建自定义样式,并将其设置为主题,但此方法无效。

代码示例2中,我全局设置了属性并正常工作。但是,它也会影响其他组件,因此无效。

  • 为什么代码示例1无法正常工作?

问题2

我需要更改all 的tabTextColortabSelectedTextColor属性TabLayout,因此我尝试了以下操作:

代码示例3

<resources>
  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:tabWidgetStyle">@style/TabsStyle</item>
  </style>

  <style name="TabsStyle" parent="Widget.Design.TabLayout">
    <item name="tabTextColor">@color/tabTextColor</item>
    <item name="tabSelectedTextColor">@color/tabSelectedTextColor</item>
  </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我得到它的唯一方法是手动将它们设置为XML:

<android.support.design.widget.TabLayout
    [...]
    android:background="?android:attr/colorPrimary"
    app:tabTextColor="@color/tabTextColor"
    app:tabSelectedTextColor="@color/tabSelectedTextColor" />
Run Code Online (Sandbox Code Playgroud)
  • 为什么代码示例3无法正常工作?

最后,我将推荐任何有关好的样式和主题指南/书籍的参考。我真的需要对此进行改进。

提前致谢。

Che*_*amp 5

在全局范围内为后退箭头指定颜色 Toolbar

这并不像可能的那么简单,但是请尝试以下操作:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- style the back arrow -->
    <item name="toolbarNavigationButtonStyle">@style/NavButtonStyle</item>
</style>

<style name="NavButtonStyle" parent="@style/Widget.AppCompat.Toolbar.Button.Navigation">
    <item name="android:tint">#FF0000</item>
</style>
Run Code Online (Sandbox Code Playgroud)

它将android:tint改变后退箭头的颜色。

通常,默认的工具栏样式由属性设置toolbarStyle。在下面的XML中,将其设置为@style/MyToolbarStyleMyToolbarStyle定义三个属性,这些属性将用于应用程序内的所有工具栏。这是一个什么样子:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="toolbarStyle">@style/MyToolbarStyle</item>
        <item name="titleTextColor">@android:color/holo_red_light</item>
    </style>

    <style name="MyToolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
        <item name="titleTextColor">@android:color/white</item>
        <item name="subtitleTextColor">@android:color/holo_green_light</item>
        <item name="android:background">@color/vermillion</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如您所见,MyToolbarStyle设置三个属性的值。不幸的是,这种方法不适用于所有属性,例如colorControlNormal在主题中指定的属性会更改后退箭头的颜色。


关于以下问题TabLayout

尚没有解决方案来为全局定义属性TabLayout。你可以做一些像这样,只是覆盖Widget.Design.TabLayout,但你将不得不重新创建所有定义有属性和这些属性可以根据运行的版本改变。这行得通,但可能是一个维护问题。我认为这不是一个好的解决方案。

另一个解决方案是创建自己的自定义TabLayout。这将非常简单,并将其定义tabTextAppearance为的全局默认属性TabLayout。整个自定义布局将如下所示:

public class MyTabLayout extends TabLayout {
    public MyTabLayout(Context context, AttributeSet attrs) {
        super(context, attrs, R.attr.tabTextAppearance);
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦你替换所有引用TabLayoutMyTabLayout,你就可以做到以下几点在styles.xml

<style name="AppTheme" parent="BaseAppTheme">
    <item name="tabTextAppearance">@style/MyTabStyle</item>
</style>

<style name="MyTabStyle" parent="Widget.Design.TabLayout">
    <item name="tabTextColor">#FF0000</item>
    <item name="tabSelectedTextColor">#00FF00</item>
</style>
Run Code Online (Sandbox Code Playgroud)

这将使选项卡文本的颜色变为红色和绿色,但它们可以是您选择的颜色。现在,您可以TabLayout在XML中声明a 并应用默认样式,而不必显式指定样式/主题。

潜在的问题是,TabLayout不使用CTOR来defStyleResource定义默认样式,该默认样式将应用于主题中定义的视图,而tabWidgetStyle不是主题。(请参阅。)自定义布局MyTabLayout可解决此问题。但是,这的确提出了一个问题,即是否存在defStyleResource未使用的原因,也许我们正陷入一个最好避免的贿赂地区。

这些方法确实有效,但是我还没有完全测试它们。您将必须确定是执行此处描述的操作还是更好地进行定义,或者仅逐个视图地定义样式是更好的选择。

如果有人可以通过Android认可的标准方法来TabLayout全局指定属性,那么我将很高兴听到它。