Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在哪里放置XML样式 问题1_Android_Android Toolbar_Android Theme_Android Styles - Fatal编程技术网

Android 在哪里放置XML样式 问题1

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=

我希望所有工具栏看起来都一样,没有设置所有工具栏的样式, 所以我想我应该为它设置应用程序主题。我希望他们都有一个颜色控制正常的心房。这些是我的尝试:

代码示例1:

但它不起作用,我让它起作用的唯一方法是用XML手动设置它们:

<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提供了一个更适合我的解决方案。我只能投你一票。“谢谢,”琼萨拉特说,“不用担心。我不知道工具栏导航按钮样式,所以这对我来说也是一场胜利。