Android Button有默认padding值的元凶!!!

本文介绍如何解决Android Button默认样式导致的高度和内边距问题,并通过调整minHeight属性实现精确样式控制。

刚给群里的小伙伴实现了一个自定义view,效果图如下

这里写图片描述

当我正准备开心地告诉小伙伴我已经实现好了的时候,这个b没装好哈~~~

为了跟小伙伴发的效果图达到几乎相似的效果,于是打算把button按钮样式也给写了(原谅我处女座哈!!)

就是控件最下方的那两个按钮,看到这个按钮样式的时候,小伙伴是不是也第一时间想到定义一个shape文件就好了呢,所以我就去定义了一个shape文件:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false">
        <shape>
            <corners android:radius="5dp"/>
            <stroke android:color="#fff" android:width="1dp"/>
            <solid android:color="#00000000"/>
        </shape>
    </item>
    <item android:state_pressed="true">
        <shape>
            <solid android:color="#00000000"/>
        </shape>
    </item>
    <item>
        <shape>
            <corners android:radius="5dp"/>
            <stroke android:color="#fff" android:width="1dp"/>
            <solid android:color="#00000000"/>
        </shape>
    </item>
</selector>

然后运用在layout文件中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#a7ff0000"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <com.yasin.measuredemo.view.MeasureView
        android:id="@+id/id_measure_view"
        android:layout_marginTop="40dp"
        android:layout_marginLeft="40dp"
        android:layout_marginRight="40dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         />
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0"
            android:textColor="#fff"
            android:textSize="14sp"
            android:layout_centerVertical="true"
            />
        <TextView
            android:layout_centerInParent="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="最近一次测量:%1$s"
            android:textColor="#fff"
            android:textSize="15sp"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="150"
            android:textColor="#fff"
            android:textSize="14sp"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            />
    </RelativeLayout>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="10dp"
        >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="单次测试"
            android:background="@drawable/selector_btn"
            android:textColor="#fff"
            android:textSize="14sp"

            />
        <Button
            android:layout_alignParentRight="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="单次测试"
            android:background="@drawable/selector_btn"
            android:textColor="#fff"
            android:textSize="14sp"

            />
    </RelativeLayout>
</LinearLayout>

这里写图片描述
可以看到,左边那个按钮我什么都没加,然后貌似默认给了我一个padding值,
于是我修改:

 <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="单次测试"
            android:background="@drawable/selector_btn"
            android:textColor="#fff"
            android:textSize="14sp"
            android:padding="0dp"
            />

把button的padding值设为了0,还是没用!!!

然后我就给button宽高定死了:

android:layout_width="100d p"
            android:layout_height="50dp"

是的!!!可以了~~~

但是我就是不想定死啊,这可咋办,于是想到了是不是系统默认给button设置的样式,于是打开了button源码:

 * {@link android.R.styleable#View View Attributes}
 * </p>
 */
@RemoteView
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 CharSequence getAccessibilityClassName() {
        return Button.class.getName();
    }
}

代码很少,我们看到button默认的样式:

com.android.internal.R.attr.buttonStyle

于是带着怀疑去sdk25源码中找了一番:

<style name="Widget.Toolbar">
        <item name="titleTextAppearance">@style/TextAppearance.Widget.Toolbar.Title</item>
        <item name="subtitleTextAppearance">@style/TextAppearance.Widget.Toolbar.Subtitle</item>
        <item name="minHeight">?attr/actionBarSize</item>
        <item name="titleMargin">4dp</item>
        <item name="maxButtonHeight">@dimen/action_bar_default_height_material</item>
        <item name="buttonGravity">top</item>
        <item name="navigationButtonStyle">@style/Widget.Toolbar.Button.Navigation</item>
        <item name="collapseIcon">?attr/homeAsUpIndicator</item>
        <item name="collapseContentDescription">@string/toolbar_collapse_description</item>
        <item name="contentInsetStart">16dp</item>
        <item name="contentInsetStartWithNavigation">@dimen/action_bar_content_inset_with_nav</item>
        <item name="touchscreenBlocksFocus">true</item>
    </style>

    <style name="Widget.Toolbar.Button.Navigation" parent="Widget">
        <item name="background">?attr/selectableItemBackground</item>
        <item name="minWidth">56dp</item>
        <item name="scaleType">center</item>
    </style>

好吧,终于是找到元凶了,原来系统默认给button的最小值设置成了56dp,怪不得我咋设置高度跟padding都是这个高,唉唉!!
于是对症下药,我们修改我们button的minheight为0:

<Button
            android:layout_alignParentRight="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="单次测试"
            android:background="@drawable/selector_btn"
            android:textColor="#fff"
            android:textSize="14sp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:minHeight="0dp"
            />

设置完android:minHeight=0dp后,就正常显示了。这算不算sdk25留的坑呢??

### Android Button 默认样式 在 Android 中,默认情况下 `Button` 控件会应用系统的默认主题样式。对于不同版本的 Android 和不同的设备制造商,这些默认样式可能会有所不同。 当创建一个标准的 `Button` 而不指定任何额外属性时,该按钮将继承当前应用程序的主题设置中的默认外观[^1]。具体来说: - **背景颜色**:通常采用的是基于所选主题的颜色方案的一部分。例如,在 Material Design 主题下,默认背景颜色通常是通过 `?attr/colorPrimary` 属性来决定的。 - **文字颜色**:同样依赖于主题配置文件中定义的文字颜色属性,比如 `?attr/colorOnSurface` 可能用于表示正常状态下的文本颜色[^3]。 为了查看确切的默认样式细节,可以查阅特定 API 级别的官方文档或源码资源。此外,如果想要自定义按钮样式,则可以通过 XML 文件定义新的风格并将其应用于目标组件上,如下所示: ```xml <!-- 定义一个新的样式 --> <style name="AppTheme.Button" parent="Widget.MaterialComponents.Button"> <!-- 设置一些属性 --> </style> ``` 之后可以在布局文件里这样使用这个新样式的按钮: ```xml <Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me!" android:theme="@style/AppTheme.Button"/> ``` 上述代码片段展示了如何为按钮设定一种名为 `AppTheme.Button` 的主题,这允许开发者覆盖默认的行为和视觉特性。 #### 关于 Hotseat 功能中的 All App 按钮 得注意的是,在某些项目如 Launcher 应用程序中,可能涉及到更复杂的 UI 组件设计,像 hotseat 上添加 all app 按钮这样的操作涉及到了多个类之间的交互以及 XML 布局文件的修改[^4]。不过这部分内容主要针对特定应用场景,并不是一般意义上的按钮默认样式讨论范围之内。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值