2017-08-15 66 views
1

UPDATE:正如在评论中指出,“Widget.AppCompat.EditText”是一个AppCompatEditText子类正确的父样式。在我的情况下,真正的问题是我忘记了在我们的主题中为控件的默认样式属性赋值,所以我们的控件没有得到任何样式作为默认值。你怎么能找到的默认样式的窗口小部件(即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> 

正如我所说的,没有以上似乎工作。

那么如何找到真正的父母风格使用?

+0

默认为['Widget.AppCompat.EditText'](https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/V7 /程序兼容性/ RES /价值/ themes_base.xml#223)。你如何设定风格? –

+0

@#$$!我忘了将我们的风格分配给我们的风格属性。你是对的。风格一直在努力。 – MarqueIV

+0

发表你的回答,包括我遗漏的一块,我会将你的标记标记为已接受的标记。比自己回答这个问题或者让它开放更好。另外你得到积分。 – MarqueIV

回答

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页面,以“发现”可用的内容。但是,对于大多数允许默认样式的大多数View来说,找到此方法的一般可靠方法是检查源代码。

A View子类通常会实现至少三个构造函数:一个只需要一个Context;一个需要ContextAttributeSet;以及Context,AttributeSetintdefStyleAttr,默认样式属性。这个属性是我们正在寻找的。它通常会有一个明智的名称,如editTextStyle,textViewStyle,checkboxStyle等。如果您已经知道该名称,则可以跳过检查View类。

在链接它们的构造函数的View中,这个属性通常是从双参数构造函数调用三参数构造函数。在AppCompatEditText中,我们可以看到此属性的名称是editTextStyle

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

后,我们已经为属性得到了名字,我们然后前往res/values/目录平台或支持包的View是,默认值将在相关themes*.xml文件为您的应用程序的父主题。

对于平台主题,针对特定主题版本(如Holo和Material)有一个基准themes.xmlfew others

对于支持库View情况下,它们的主题文件将特定的包res/values/目录下,默认的属性值可以是themes.xmlthemes_base.xml

在第7版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> 
相关问题