源码路 之 聊聊 Button 默认值引发的坑坑

LZ-Says:enmmm,希望所有的一切都将会有一个好的结果。虽然菜比一个,但是只要努力了,就会有好的结果~!!!

这里写图片描述

前言

Enmmm,今天突然奇想,玩玩 shape 文件。

Enmmm,我想的挺美好的。

结果,mmp了。

先放上一波效果图:

这里写图片描述

各位看官请看右侧,MMP,我就是写个 shape 文件,怎么边距这么大呢?

Enmmm,下面一起跟随贺仔瞧瞧今天的坑坑吧~

Enmmm,难受

一开始,LZ 在想,会不会是内外边距导致的呢?

风风火火,设置内外边距均为 0,美美的点击运行,心想,MMP,坑我,揍你,哇咔咔。

结果一出来,只听啪啪俩声脆响,MMP,没效果。

Enmmm,我 。。。

看看源码吧。希望能找到问题根源。

本文基于 Android API 27。

首先查看 Button 源码:

public class Button extends TextView {
    public Button(Context context) {
        this(context, null);
    }

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

    public Button(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

    public Button(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
        super.onInitializeAccessibilityEvent(event);
        event.setClassName(Button.class.getName());
    }

    @Override
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(info);
        info.setClassName(Button.class.getName());
    }
}

这边发现了一个默认 Style,如下:

com.android.internal.R.attr.buttonStyle

会不会是这个 Style 设置了什么鬼呢?

可能设置什么呢?猜一波~

Enmmm,设置内外边距都无效,会不会是最小高度 / 宽度?

Enmmm,试试吧。

Enmmm,搜了老半天,不负众望啊,请看:

<!-- Button styles -->
<item name="buttonStyle">@style/Widget.Button</item>

继续深入,查看根究:

    <style name="Widget.Button">
        <item name="background">@drawable/btn_default</item>
        <item name="focusable">true</item>
        <item name="clickable">true</item> // 默认开启字母转大写
        <item name="textAppearance">?attr/textAppearanceSmallInverse</item>
        <item name="textColor">@color/primary_text_light</item>
        <item name="gravity">center_vertical|center_horizontal</item>
    </style>
    <style name="Widget.Button.Small">
        <item name="background">@drawable/btn_default_small</item>
    </style>
    <style name="Widget.Button.Inset">
        <item name="background">@drawable/button_inset</item>
    </style>
    <style name="Widget.Button.Transparent">
        <item name="background">@drawable/btn_default_transparent</item>
        <item name="textAppearance">?attr/textAppearanceSmall</item>
        <item name="textColor">@color/white</item>
    </style>

以上内容则是针对 Button 不同的状态设置的不同 Style。

而下面,则是 Button 默认的 Selector 样式文件,里面包含着一些事件触发时的一些状态值,很详细,很 nice,以后可以根据这个来仿造我们的 Button 不同情况下的不同样式。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_window_focused="false" android:state_enabled="true"
        android:drawable="@drawable/btn_default_normal" />
    <item android:state_window_focused="false" android:state_enabled="false"
        android:drawable="@drawable/btn_default_normal_disable" />
    <item android:state_pressed="true" 
        android:drawable="@drawable/btn_default_pressed" />
    <item android:state_focused="true" android:state_enabled="true"
        android:drawable="@drawable/btn_default_selected" />
    <item android:state_enabled="true"
        android:drawable="@drawable/btn_default_normal" />
    <item android:state_focused="true"
        android:drawable="@drawable/btn_default_normal_disable_focused" />
    <item
         android:drawable="@drawable/btn_default_normal_disable" />
</selector>

找了半天,没找到,突然想到,会不会在主题中设置了呢?

带着疑问,在万能的 Android Studio 中进行逐步查找,果不其然,如下:

    <style name="Base.Widget.AppCompat.Button" parent="android:Widget">
        <item name="android:background">@drawable/abc_btn_default_mtrl_shape</item>
        <item name="android:textAppearance">?android:attr/textAppearanceButton</item>
        <item name="android:minHeight">48dip</item>
        <item name="android:minWidth">88dip</item>
        <item name="android:focusable">true</item>
        <item name="android:clickable">true</item>
        <item name="android:gravity">center_vertical|center_horizontal</item>
    </style>

mmp呦~!!!

而主题中,也是将 Button 按钮的默认字体大小设置为 14 sp,且开启英文转大写。

enmmm,本实例中使用的主题为:Theme.AppCompat.NoActionBar

<style name="Base.TextAppearance.AppCompat.Button">
    <item name="android:textSize">@dimen/abc_text_size_button_material</item>
    <item name="textAllCaps">true</item>
    <item name="android:textColor">?android:textColorPrimary</item>
</style>

Enmmm,无奈了。

收获与反思

不瞒各位老铁,关于查看这个源码,一开始走进了一个误区,也就是上面走到了 @style/Widget.Button 却发现怎么都走不下去了。

其实很多时候,换个角度,换个思维,一切也变得没有那么蛋疼了。

卡了我整整 3 天呐~!!!

如果有其他问题,可继续沟通~~~

LZ 也是小白一枚~~~

个人公众号

不定期发布博文,欢迎各位看官观看~

这里写图片描述

参考资料

  1. http://androidxref.com
  2. https://android.googlesource.com

猜你喜欢

转载自blog.csdn.net/u012400885/article/details/81039844