Android 在哪里放置XML样式 问题1
我希望所有工具栏看起来都一样,没有设置所有工具栏的样式, 所以我想我应该为它设置应用程序主题。我希望他们都有一个颜色控制正常的心房。这些是我的尝试: 代码示例1: 但它不起作用,我让它起作用的唯一方法是用XML手动设置它们:Android 在哪里放置XML样式 问题1,android,android-toolbar,android-theme,android-styles,Android,Android Toolbar,Android Theme,Android Styles,我希望所有工具栏看起来都一样,没有设置所有工具栏的样式, 所以我想我应该为它设置应用程序主题。我希望他们都有一个颜色控制正常的心房。这些是我的尝试: 代码示例1: 但它不起作用,我让它起作用的唯一方法是用XML手动设置它们: <android.support.design.widget.TabLayout [...] android:background="?android:attr/colorPrimary" app:tabTextColor=
<android.support.design.widget.TabLayout
[...]
android:background="?android:attr/colorPrimary"
app:tabTextColor="@color/tabTextColor"
app:tabSelectedTextColor="@color/tabSelectedTextColor" />
为什么代码示例3不起作用?
最后,我将对所有关于好的风格和主题指南/书籍的参考进行投票。我真的需要在这方面提高
提前感谢。全局指定工具栏中后退箭头的颜色
这并不像可能应该的那样简单,但请尝试以下操作:
<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>
如您所见,MyToolbarStyle设置三个属性的值。不幸的是,这种方法并不适用于所有属性,例如colorControlNormal,如果在主题中指定,它将更改后向箭头的颜色
关于表格布局的问题:
对于全局定义TabLayout的属性,没有很好的解决方案。您可以执行类似的操作,只覆盖Widget.Design.TabLayout,但您必须重新创建其中定义的所有属性,并且这些属性可能会根据正在运行的版本而更改。这是可行的,但维护起来可能会有问题。我认为这不是一个好的解决办法
另一个解决方案是创建自己的自定义表格布局。这将非常简单,只需将tabTextAppearance定义为TableLayout的全局默认属性。整个自定义布局将如下所示:
public class MyTabLayout extends TabLayout {
public MyTabLayout(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.tabTextAppearance);
}
}
public class MyToolbar extends Toolbar {
public MyToolbar(Context context, AttributeSet attrs) {
super(wrapContext(context), attrs);
}
private static Context wrapContext(Context context) {
return new ContextThemeWrapper(context, R.style.MyToolbarTheme);
}
}
<com.example.stackoverflow.MyToolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
将对TabLayout的所有引用替换为MyTabLayout后,您将能够在styles.xml中执行以下操作:
这将使选项卡文本颜色为红色和绿色,但它们可以是您选择的颜色。现在,您可以用XML声明TabLayout并对其应用默认样式,而无需显式指定样式/主题
潜在的问题是TabLayout的CTOR不使用defStyleResource,该资源定义了应用于主题中定义的视图的默认样式,而tabWidgetStyle不是。。看见自定义布局MyTableAyout可避免此问题。然而,这确实提出了一个问题,即是否有理由不使用defStyleResource,也许我们正潜入一个我们最好避免的荆棘地带
这些方法确实有效,但我还没有完全测试它们。您必须确定是执行此处描述的操作更好,还是在逐个视图的基础上定义样式更好
如果有人有一个标准的、Android认可的方法来在全球范围内指定TabLayout属性,我会很高兴听到这个消息
全局指定工具栏中后退箭头的颜色
这并不像可能应该的那样简单,但请尝试以下操作:
<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>
如您所见,MyToolbarStyle设置三个属性的值。不幸的是,这种方法并不适用于所有属性,例如colorControlNormal,如果在主题中指定,它将更改后向箭头的颜色
关于表格布局的问题:
对于全局定义TabLayout的属性,没有很好的解决方案。您可以执行类似的操作,只覆盖Widget.Design.TabLayout,但您必须重新创建其中定义的所有属性,并且这些属性可能会根据正在运行的版本而更改。这是可行的,但维护起来可能会有问题。我认为这不是一个好的解决办法
另一个解决方案是创建自己的自定义表格布局。这将非常简单,只需将tabTextAppearance定义为TableLayout的全局默认属性。整个自定义布局将如下所示:
public class MyTabLayout extends TabLayout {
public MyTabLayout(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.tabTextAppearance);
}
}
public class MyToolbar extends Toolbar {
public MyToolbar(Context context, AttributeSet attrs) {
super(wrapContext(context), attrs);
}
private static Context wrapContext(Context context) {
return new ContextThemeWrapper(context, R.style.MyToolbarTheme);
}
}
<com.example.stackoverflow.MyToolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
将对TabLayout的所有引用替换为MyTabLayout后,您将能够在styles.xml中执行以下操作:
这将使选项卡文本颜色为红色和绿色,但它们可以是您选择的颜色。现在,您可以用XML声明TabLayout并对其应用默认样式,而无需显式指定样式/主题
潜在的问题是TabLayout的CTOR不使用defStyleResource,该资源定义了应用于主题中定义的视图的默认样式,而tabWidgetStyle不是。。看见自定义布局MyTableAyout可避免此问题。然而,这确实提出了一个问题,即是否有理由不使用defStyleResource,也许我们正潜入一个我们最好避免的荆棘地带
这些方法确实有效,但我还没有完全测试它们。您必须确定是执行此处描述的操作更好,还是在逐个视图的基础上定义样式更好
如果有人有一个标准的、Android认可的方法来在全球范围内指定TabLayout属性,我会很高兴听到这个消息
问题1
一个主题和一种风格之间的区别是微妙的,事情比它们应该的更混乱,因为你
使用一个标记来定义它们。但即使它们都使用标记,它们的行为也不同
视图主题中指定的属性应用于该视图及其所有子视图。视图样式中指定的属性仅适用于该视图。此外,还有一些称为主题属性的属性,仅当它们是主题的一部分时才起作用。colorControlNormal是一个主题属性;将其设置为样式不会产生任何效果
代码示例1不起作用,因为元素是在样式而不是主题中定义的
代码示例2更改了所有内容,因为现在colorControlNormal位于应用程序的主题中,所以它适用于应用程序中关心它的所有元素
不幸的是,我认为没有办法简单地为应用程序中的每个工具栏指定一个主题。您必须满足以下条件之一:
<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>
1使用android:theme属性
为此,您可以创建如下样式:
<style name="MyToolbarTheme">
<item name="colorControlNormal">@color/toolbarColorControlNormal</item>
</style>
2创建工具栏的自定义子类
同样,你需要像上面这样的风格。然后创建一个如下所示的类:
public class MyTabLayout extends TabLayout {
public MyTabLayout(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.tabTextAppearance);
}
}
public class MyToolbar extends Toolbar {
public MyToolbar(Context context, AttributeSet attrs) {
super(wrapContext(context), attrs);
}
private static Context wrapContext(Context context) {
return new ContextThemeWrapper(context, R.style.MyToolbarTheme);
}
}
<com.example.stackoverflow.MyToolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
并在布局文件中使用它,如下所示:
public class MyTabLayout extends TabLayout {
public MyTabLayout(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.tabTextAppearance);
}
}
public class MyToolbar extends Toolbar {
public MyToolbar(Context context, AttributeSet attrs) {
super(wrapContext(context), attrs);
}
private static Context wrapContext(Context context) {
return new ContextThemeWrapper(context, R.style.MyToolbarTheme);
}
}
<com.example.stackoverflow.MyToolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
进一步阅读
以下是我学习这些东西时读到的一些材料:
问题1
主题和样式之间的区别是微妙的,事情比它们应该的更混乱,因为您使用标记来定义它们。但即使它们都使用标记,它们的行为也不同
视图主题中指定的属性应用于该视图及其所有子视图。视图样式中指定的属性仅适用于该视图。此外,还有一些称为主题属性的属性,仅当它们是主题的一部分时才起作用。colorControlNormal是一个主题属性;将其设置为样式不会产生任何效果
代码示例1不起作用,因为元素是在样式而不是主题中定义的
代码示例2更改了所有内容,因为现在colorControlNormal位于应用程序的主题中,所以它适用于应用程序中关心它的所有元素
不幸的是,我认为没有办法简单地为应用程序中的每个工具栏指定一个主题。您必须满足以下条件之一:
<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>
1使用android:theme属性
为此,您可以创建如下样式:
<style name="MyToolbarTheme">
<item name="colorControlNormal">@color/toolbarColorControlNormal</item>
</style>
2创建工具栏的自定义子类
同样,你需要像上面这样的风格。然后创建一个如下所示的类:
public class MyTabLayout extends TabLayout {
public MyTabLayout(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.tabTextAppearance);
}
}
public class MyToolbar extends Toolbar {
public MyToolbar(Context context, AttributeSet attrs) {
super(wrapContext(context), attrs);
}
private static Context wrapContext(Context context) {
return new ContextThemeWrapper(context, R.style.MyToolbarTheme);
}
}
<com.example.stackoverflow.MyToolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
并在布局文件中使用它,如下所示:
public class MyTabLayout extends TabLayout {
public MyTabLayout(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.tabTextAppearance);
}
}
public class MyToolbar extends Toolbar {
public MyToolbar(Context context, AttributeSet attrs) {
super(wrapContext(context), attrs);
}
private static Context wrapContext(Context context) {
return new ContextThemeWrapper(context, R.style.MyToolbarTheme);
}
}
<com.example.stackoverflow.MyToolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
进一步阅读
以下是我学习这些东西时读到的一些材料:
右键单击res文件夹,选择新建->Android资源文件,为新文件样式设置相同的名称,在可用限定符中:选择最后一个项目版本并最终设置平台API级别21。右键单击res文件夹,选择新建->Android资源文件,为新文件样式设置相同的名称,在可用限定符中:选择最后一个项目版本并最终设置平台API级别21。是否在AndroidManifes中设置了主题?@fisher3421如果我没有,第二个代码示例将无法工作。我强烈推荐使用github。在实践中学习。在关于样式和主题的文章中有很好的概述。您是否使用和?tabWidgetStyle适用于这些控件,而不适用于TabLayout,它似乎不像其他小部件那样具有默认值。如果你能澄清这一点,这将有助于给出答案。有关tabWidgetStyle属性的使用,请参见。是否在AndroidManifes中设置了主题?@fisher3421如果我不这样做,第二个代码示例将无法工作。我强烈建议使用github。在实践中学习。在关于样式和主题的文章中有很好的概述。您是否使用和?tabWidgetStyle适用于这些控件,而不适用于TabLayout,它似乎不像其他小部件那样具有默认值。如果你能澄清这一点,这将有助于给出答案。有关tabWidgetStyle属性的使用,请参阅。感谢您的回答。我真的把重点放在了一个简单的问题上,那就是:如果不使用android:theme=@style/MyToolbarStyle显式设置@style/MyToolbarStyle,我为什么要在主主题中添加@style/MyToolbarStyle?我想小部件会从主主题中读取属性,为什么我要设置两次呢?不是所有小部件都可以从主主题中读取属性吗?@JonZarate啊,但是你不必添加android:theme=@style/MyToolbarStyle。您在我提供的XML中看到了吗?用我提供的XML和java代码做一个简单的项目,你就会明白我的意思。是的,我明白了,但是colorControlNormal不起作用。我更新了帖子和问题。@JonZarate您希望colorControlNormal在工具栏中为您做什么?更改后箭头颜色谢谢您的回答。我真的把重点放在了一个简单的问题上,那就是:如果不使用android:theme=@style/MyToolbarStyle显式设置@style/MyToolbarStyle,我为什么要在主主题中添加@style/MyToolbarStyle?我想小部件会从主主题中读取属性,为什么我要设置它
两次不是所有小部件都可以从主主题中读取属性吗?@JonZarate啊,但是你不必添加android:theme=@style/MyToolbarStyle。您在我提供的XML中看到了吗?用我提供的XML和java代码做一个简单的项目,你就会明白我的意思。是的,我明白了,但是colorControlNormal不起作用。我更新了帖子和问题。@JonZarate您希望colorControlNormal在工具栏中为您做什么?更改后箭头颜色即使我更喜欢您的答案更有条理、更清晰,另一个答案通过XML提供了更适合我的解决方案。我只能投你一票。“谢谢,”琼萨拉特说,“不用担心。我不知道toolbarNavigationButtonStyle,所以这对我来说也是一个胜利。尽管我更喜欢你的答案更为条理清晰,但另一个答案通过XML提供了一个更适合我的解决方案。我只能投你一票。“谢谢,”琼萨拉特说,“不用担心。我不知道工具栏导航按钮样式,所以这对我来说也是一场胜利。