Android Button有默认padding值的元凶

2024-02-28 09:38

本文主要是介绍Android Button有默认padding值的元凶,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

刚给群里的小伙伴实现了一个自定义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.MeasureViewandroid: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"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="0"android:textColor="#fff"android:textSize="14sp"android:layout_centerVertical="true"/><TextViewandroid:layout_centerInParent="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="最近一次测量:%1$s"android:textColor="#fff"android:textSize="15sp"/><TextViewandroid: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><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:layout_marginTop="10dp"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="单次测试"android:background="@drawable/selector_btn"android:textColor="#fff"android:textSize="14sp"/><Buttonandroid: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值, 
于是我修改:

 <Buttonandroid: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);}@Overridepublic 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:

<Buttonandroid: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有默认padding值的元凶的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755099

相关文章

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk