gpt4 book ai didi

android - 如何找到小部件的默认样式(即 AppCompatEditText)

转载 作者:搜寻专家 更新时间:2023-11-01 08:25:31 26 4
gpt4 key购买 nike

UPDATE: As pointed out in the comments, 'Widget.AppCompat.EditText' is the correct parent style for an AppCompatEditText subclass. In my case, the real issue was I had forgotten to assign a value to our control's default style attribute in our theme, so our control wasn't getting any style to use as a default.

However, this question still could use an answer as to how one properly identifies which style to use as a parent when defining your own default styles when subclassing the standard controls. As such, I've also renamed its title.

As such, I'm leaving this open in hopes someone can answer that question since it will help any who wish to do something similar.

我们正在尝试为整个应用程序中使用的所有 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>

正如我所说,以上似乎都不起作用。

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

最佳答案

为了解决眼前的问题,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 页面,以“发现”可用的内容。但是,对于大多数允许默认样式的 View,找到它的通常可靠的方法是检查源代码。

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

在链接其构造函数的 View 中,此属性通常在从二参数构造函数调用三参数构造函数时出现。在 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。

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

在 v7 appcompat 中,我们应用的确切父主题可能在 v7/appcompat/res/values/themes.xml 中,尽管大多数主题只是基本主题的直接别名;也就是说,他们不会覆盖他们 parent 的任何属性值。 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>

关于android - 如何找到小部件的默认样式(即 AppCompatEditText),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45695647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com