【问题标题】:How can you locate the default style for a widget (i.e. AppCompatEditText)如何找到小部件的默认样式(即 AppCompatEditText)
【发布时间】:2017-08-15 15:02:19
【问题描述】:

更新: 正如 cmets 中所指出的,“Widget.AppCompat.EditText”是 AppCompatEditText 子类的正确父样式。就我而言,真正的问题是我忘记在主题中为控件的默认样式属性赋值,因此我们的控件没有任何样式可用作默认样式。

但是,这个问题仍然可以使用一个答案,即在子类化标准控件时定义您自己的默认样式时如何正确识别用作父样式的样式。因此,我也重命名了它的标题。

因此,我将这个问题保持开放状态,希望有人能回答这个问题,因为它会帮助任何希望做类似事情的人。

我们正在尝试为整个应用程序中使用的所有 AppCompatEditText 控件定义一个通用的外观。因此,我们不必在每次使用时手动应用“样式”属性,而是尝试用我们自己的样式替换默认样式。

替换默认样式实际上是简单的部分。不知道我们的样式的父样式应该设置为什么,所以我们仍然拥有原始样式的所有方面,我们没有明确地用我们的样式覆盖。

挖掘 AppCompatEditText 的源代码,它显示了要存储在 R.attr.editTextStyle 中的默认样式,但我不确定现在去哪里查看其中存储的值。

实验也没有让我们取得任何进展。到目前为止,无论我们尝试了什么,我们都完全失去了默认外观。没有下划线,没有背景,没有填充,什么都没有。只是我们设置的值,这意味着它没有采用父样式。

我们尝试了以下但没有成功...

<style name="ZinEditText" parent="android:Widget.EditText">
    <item name="zinTypeface">light</item>
    <item name="android:textSize">@dimen/defaultTextSize</item>
    <item name="android:lineSpacingMultiplier">@dimen/defaultLineSpacing</item>
</style>

<style name="ZinEditText" parent="Widget.AppCompat.EditText">
    <item name="zinTypeface">light</item>
    <item name="android:textSize">@dimen/defaultTextSize</item>
    <item name="android:lineSpacingMultiplier">@dimen/defaultLineSpacing</item>
</style>

<style name="ZinEditText" parent="Base.V7.Widget.AppCompat.EditText">
    <item name="zinTypeface">light</item>
    <item name="android:textSize">@dimen/defaultTextSize</item>
    <item name="android:lineSpacingMultiplier">@dimen/defaultLineSpacing</item>
</style>

<style name="ZinEditText" parent="Widget.Holo.EditText">
    <item name="zinTypeface">light</item>
    <item name="android:textSize">@dimen/defaultTextSize</item>
    <item name="android:lineSpacingMultiplier">@dimen/defaultLineSpacing</item>
</style>

正如我所说,上述方法似乎都不起作用。

那么如何找到要使用的实际父样式呢?

【问题讨论】:

  • 默认为Widget.AppCompat.EditText。你是如何设置风格的?
  • @#$$!我忘记将我们的样式分配给我们的样式属性。你是对的。这种风格一直有效。
  • 发布您的答案作为答案,包括我遗漏的部分,我会将您的标记为已接受。比自己回答这个问题或让它打开要好。另外,您可以获得积分。
  • 我们都去过那里。 :-) 这只是一个简单的疏忽。如果你想把它称为免费赠品,我不介意你只是想删除它。由你决定。很高兴你成功了。
  • 实际上,更好的是,因为从技术上讲,我的问题是关于如何知道默认样式是什么,即使这不是我实际问题的根源,这个问题仍然可以使用答案。你马上就知道那是什么了。介意写下你是如何查找的,以便其他从事其他组件工作的人也知道去哪里吗?例如,按钮、单选按钮和复选框呢?基本上任何标准控件。

标签: android styles themes


【解决方案1】:

为了解决眼前的问题,AppCompatEditText 的默认样式是 Widget.AppCompat.EditText。您展示的第二个示例是正确的:

<style name="ZinEditText" parent="Widget.AppCompat.EditText">
    ...

这需要在您的应用主题中设置为editTextStyle。

<style name="AppTheme" parent="@style/Theme.AppCompat">
    <item name="editTextStyle">@style/ZinEditText</item>
    ...

据我所知,在任何地方都没有正式记录找到这些默认样式和属性。 Styles and Themes 的官方文档只是将一个人定向到框架和支持包的各种 R.attr 页面,以“发现”可用的内容。但是,对于大多数允许默认样式的Views,通常可靠的方法是检查源代码。

View 子类通常会实现至少三个构造函数:一个只接受 Context;一个需要Context 和AttributeSet 的;一个接受Context、AttributeSet 和int 的defStyleAttr,默认样式属性。这个属性就是我们要找的。它通常会有一个合理的名称,例如editTextStyle、textViewStyle、checkboxStyle 等。如果您已经知道该名称,则可以跳过检查View 类。

在链接其构造函数的Views 中,此属性通常会在从二参数构造函数调用三参数构造函数中。在AppCompatEditText中,我们可以看到这个属性的名字是editTextStyle。

public AppCompatEditText(Context context, AttributeSet attrs) {
    this(context, attrs, R.attr.editTextStyle);
}

获得属性名称后,我们前往res/values/ 所在的平台或支持包的View 目录。默认值将在您的相关themes*.xml 文件中应用的父主题。

对于平台主题,有一个基本的themes.xml,以及一个用于特定主题版本的few others,例如Holo 和Material。

对于支持库Views,这些主题文件将在包特定的res/values/目录下,默认属性值可能在themes.xml或themes_base.xml。

在 v7 appcompat 中,我们应用程序的确切父主题可能在 v7/appcompat/res/values/themes.xml,尽管大多数主题只是基本主题的直接别名;即,它们不会覆盖其父母的任何属性值。 AppCompatEditText 的默认值实际上在 v7/appcompat/res/values/themes_base.xml 中。不同主题(常规主题和灯光主题)有单独的条目,但它们都是相同的。

<item name="editTextStyle">@style/Widget.AppCompat.EditText</item>

这足以确定使用哪种样式作为我们的父样式,但是如果我们想查看样式细节,我们可以参考v7/appcompat/res/values/styles.xml,我们可以在其中找到该样式的父样式:

<style name="Widget.AppCompat.EditText" parent="Base.Widget.AppCompat.EditText"/>

这将我们带到v7/appcompat/res/values/styles_base.xml:

<style name="Base.Widget.AppCompat.EditText" parent="Base.V7.Widget.AppCompat.EditText" />

<style name="Base.V7.Widget.AppCompat.EditText" parent="android:Widget.EditText">
    <item name="android:background">?attr/editTextBackground</item>
    <item name="android:textColor">?attr/editTextColor</item>
    <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
</style>

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2012-02-22
    • 2019-11-05
    相关资源
    最近更新 更多