美文网首页
[原创]刨根问底掌握布局样式主题追踪edittext背景默认样式

[原创]刨根问底掌握布局样式主题追踪edittext背景默认样式

作者: 吉凶以情迁 | 来源:发表于2022-06-22 11:46 被阅读0次

首先从EditText源码中发现R.attr.editTextStyle
首先要说明的是style分别是materialdesign库和来系统架构目录两种,都可以定位。

    public EditText(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.editTextStyle);
    }

然后定位values文件夹


image.png image.png

分析editTextStyle
得到如下

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

然后

    <style name="Widget.EditText">
        <item name="focusable">true</item>
        <item name="focusableInTouchMode">true</item>
        <item name="clickable">true</item>
        <item name="background">?attr/editTextBackground</item>
        <item name="textAppearance">?attr/textAppearanceMediumInverse</item>
        <item name="textColor">?attr/editTextColor</item>
        <item name="gravity">center_vertical</item>
        <item name="breakStrategy">simple</item>
        <item name="hyphenationFrequency">@dimen/config_preferredHyphenationFrequency</item>
        <item name="defaultFocusHighlightEnabled">false</item>
    </style>


定位到editTextBackground
经过源码分析,发现

  <item name="editTextBackground">@drawable/abc_edit_text_material</item>
image.png
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_default" />
    <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_disabled" />
    <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_selected" />
    <item android:state_enabled="true" android:drawable="@drawable/textfield_default" />
    <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_selected" />
    <item android:drawable="@drawable/textfield_disabled" />
</selector>

定位appcompat 样式大致是一样的


image.png

最后得到的是这个

image.png
<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
       android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
       android:insetTop="@dimen/abc_edit_text_inset_top_material"
       android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">

    <selector>
        <item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
        <item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
        <item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
    </selector>

</inset>

所以大概是insertLeft搞的鬼,由于我这里是针对我的editspinner 无法和默认的保持一致,因此不能采用全局定义修改的方式进行,所以我直接拷贝复制以上

然后单独设置为背景即可。


image.png

设置前是这样的


image.png

设置后

image.png

最后我就解决了editspinner无法和edittext的背景边界对齐的问题了。


image.png

相关文章

网友评论

      本文标题:[原创]刨根问底掌握布局样式主题追踪edittext背景默认样式

      本文链接:https://www.haomeiwen.com/subject/bnzyvrtx.html