ChatGPT解决这个技术问题 Extra ChatGPT

android:drawableLeft margin 和/或 padding

是否可以为我们使用 android:drawableLeft 添加的图像设置边距或填充?


J
Jordan

正如 cephus 提到的,如果按钮足够小,android:drawablePadding 只会在文本和可绘制对象之间强制填充。

在布置较大的按钮时,您可以将 android:drawablePaddingandroid:paddingLeftandroid:paddingRight 结合使用,以强制文本和可绘制对象向内靠近按钮的中心。通过分别调整左右填充,您可以对布局进行非常详细的调整。

这是一个示例按钮,它使用填充将文本和图标推到比默认情况下更近的位置:

<Button android:text="@string/button_label" 
    android:id="@+id/buttonId"
    android:layout_width="160dip"
    android:layout_height="60dip"
    android:layout_gravity="center"
    android:textSize="13dip"
    android:drawableLeft="@drawable/button_icon"
    android:drawablePadding="2dip"
    android:paddingLeft="30dip"
    android:paddingRight="26dip"
    android:singleLine="true"
    android:gravity="center" />  

android:paddingLeft="30dip" android:paddingRight="26dip" 是这里的关键!
这与问题无关,但 android:gravity="center" 将使文本与可绘制对象的中心对齐!
如果我们在左侧和右侧都有可绘制对象,并且只需要调整右侧可绘制对象怎么办?
我只使用:android:paddingLeft,它会改变图像的位置。 android:drawablePadding 用于图像和文本之间的空间。
此代码的问题是它导致 passwordToggleDrawable 左侧填充间隙变得更大,因为它不能仅针对左侧可绘制对象。
S
StackExchange What The Heck

TextView 有一个 android:drawablePadding 属性应该可以解决问题:

android:drawablePadding 可绘制对象和文本之间的填充。必须是维度值,是一个浮点数加上一个单位,如“14.5sp”。可用单位有:px(像素)、dp(与密度无关的像素)、sp(基于首选字体大小的缩放像素)、in(英寸)、mm(毫米)。这也可能是对包含此类型值的资源(形式为“@[package:]type:name”)或主题属性(形式为“?[package:][type:]name”)的引用.这对应于全局属性资源符号drawablePadding。


R
Ragunath Jawahar

android:drawablePadding 只会在按钮小到足以将 2 压在一起时在文本和可绘制对象之间创建填充间隙。如果您的按钮比组合宽度(对于 drawableLeft/drawableRight)或高度(对于 drawableTop/drawableBottom)宽,那么 drawablePadding 不会做任何事情。

我现在也在为此苦苦挣扎。我的按钮很宽,图标挂在按钮的左边缘,文本居中。我目前解决这个问题的唯一方法是通过使用 Photoshop 在画布的左边缘添加空白像素来烘烤可绘制对象的边距。不理想,也不是很推荐。但这是我现在的权宜之计,没有重建 TextView/Button。


感谢您解释我的问题。我还没有意识到只有当按钮足够宽时才会导致它
我也有同样的问题。我的按钮很宽,因此可绘制对象不靠近文本
P
Parinda Rajapaksha

是的。如下使用drawablePadding,

<TextView
        android:id="@+id/tvHeader"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Settings and Contents"
        android:drawableLeft="@drawable/icon_success"
        android:drawablePadding="10dp" />

嗨,我可以在 drawableLeft 项目中编写单独的 onclick 事件吗
T
The Finest Artist

制作您的可绘制资源.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <inset android:drawable="@drawable/small_m" android:insetLeft="10dp" android:insetTop="10dp" />
    </item>
    <item>
        <inset android:drawable="@drawable/small_p" android:insetLeft="10dp" android:insetTop="10dp" />
    </item>
</selector>

@ The Finest Artist 我在 drawable 中使用了插图,它适用于较新版本的设备。我的意思是它不在 SDK 16、17 中工作,但在 SDK 23 中工作。有什么想法吗?
很好的答案并为此投票。你只是帮我解决了一个困扰我很久的问题。
B
Bhargav Thanki

android:drawablePadding 是为可绘制图标提供填充的最简单方法,但您不能为可绘制图标的 paddingRightpaddingLeft 提供特定的一侧填充。要实现这一点,您必须深入研究它。如果您将 paddingLeftpaddingRight 应用于 Edittext,那么它将填充整个 Edittext 以及可绘制的图标。


T
Thelouras

android:drawablePadding 是为可绘制图标提供填充的最简单方法,但您不能为可绘制图标的 paddingRightpaddingLeft 提供特定的一侧填充。要实现这一点,您必须深入研究它。如果您将 paddingLeftpaddingRight 应用于 EditText,那么它将填充整个 EditText 以及可绘制的图标。

<TextView android:layout_width="match_parent"
    android:padding="5dp"
    android:id="@+id/date"
    android:gravity="center|start"
    android:drawableEnd="@drawable/ic_calendar"
    android:background="@drawable/edit_background"
    android:hint="Not Selected"
    android:drawablePadding="10dp"
    android:paddingStart="10dp"
    android:paddingEnd="10dp"
    android:textColor="@color/black"
    android:layout_height="wrap_content"/>

它是图标和文本之间的填充,但是在 edittext 开始和可绘制开始之前填充呢?
P
Pratik Butani

为您的edittext定义一个形状并给它一个填充例如

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <padding
        android:left="5dp"
        android:right="5dp"
    />
    <solid android:color="#F6F6F6" />
    <stroke
        android:width="1px"
        android:color="#C3C3C3" />

    <corners
        android:bottomLeftRadius="1dp"
        android:bottomRightRadius="1dp"
        android:topLeftRadius="1dp"
        android:topRightRadius="1dp" />
</shape>

此形状中定义的填充将有助于为 drawableleft 或右侧提供填充 ---------- 在 EditView 上应用此形状

 <EditText
            android:id="@+id/example"
            android:layout_width="fill_parent"
            android:layout_height="36dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/shape2"
            android:drawableLeft="@drawable/icon1"
            android:drawablePadding="@dimen/txtDrwblPadding"
            android:ems="10"
         />

使用该定义的形状作为背景将为您的 EditText 提供一些样式以及 drawableLeft 的边距。


S
Stephen Rauch
<TextView
    android:layout_width="wrap_content"
    android:layout_height="32dp"
    android:background="@drawable/a"
    android:drawableLeft="@drawable/concern_black"
    android:gravity="center"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:drawablePadding="10dp"
    android:text="text"/>

注意:layout_width 需要为 wrap_content 并使用 paddingLeft paddingRight drawablePadding 来控制间隙。如果您指定 layout_width 值将在图标和文本之间存在间隙,我认为一旦给 layout_width 指定值,填充将测量。


D
Daniel Ochoa

我也会把我的答案扔进戒指。如果您想以编程方式执行此操作,您可以执行以下操作。

final Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.somedrawable);
final boolean isLTR = ViewCompat.LAYOUT_DIRECTION_LTR == ViewCompat.getLayoutDirection(this);
final int iconInsetPadding = getResources().getDimensionPixelSize(R.dimen.icon_padding);

final Drawable insetDrawable = new InsetDrawable(drawable, isLTR ? 0 : iconInsetPadding, 0, isLTR ? iconInsetPadding : 0, 0);

这会将填充添加到可绘制对象的末尾,其中 end 表示左/右,具体取决于手机是 LTR 还是 RTL。


这仅适用于 API 26+。
M
Milad Faridnia

代替 Button 使用带有 ImageViewTextViewLinearLayout。在 ImageViewTextView 等子项中使用 android:duplicateParentState="true"


您实际上需要一个 FrameLayout 和一个 Button(以及它们自己的 LinearLayout 中的 ImageView/TextView)来重现 Button UI 并将 onclicklistener() 传输到按钮部分
如果 TextView 中已经有 drawablePadding,为什么还要使用额外的布局。
s
sadat

另一个简单的解决方案可以通过 inset layerlist 来实现

layered_drawable

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <inset
            android:insetRight="30dp"
            android:drawable="@drawable/ic_air_date">
        </inset>
    </item>
</layer-list>

XML 中的按钮

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/layered_drawable"
    android:text="something" />

C
Carolina

您可以为按钮使用填充,也可以使用 drawablePadding

 <Button
    style="@style/botonesMenu"
    android:padding="15dp"
    android:drawablePadding="-15dp"
    android:text="@string/actualizarBD"
    android:textAlignment="gravity"
    android:gravity="center"
    android:layout_row="1"
    android:layout_column="0"
    android:drawableTop="@drawable/actualizar"
    android:id="@+id/btnActualizar"
    android:onClick="actualizarBD" />

您可以使用特定的填充取决于放置您的可绘制对象的位置,使用 android:paddingLeft="10dp" 或 android:paddingBottom="10dp" 或 android:paddingRight="10dp" 或 android:paddingTop="10dp"


R
RayChongJH

您应该考虑使用 layer-list

像这样创建一个可绘制文件,将其命名为 ic_calendar.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <solid android:color="@android:color/transparent"/>
    </shape>
</item>
<item android:right="10dp">
    <bitmap android:gravity="center_vertical|left"
        android:src="@drawable/ic_calendar_16dp"
        android:tint="@color/red"
        />
</item>
</layer-list>

在布局文件下,

<TextView
         android:id="@+id/tvDate"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:drawableLeft="@drawable/ic_calendar"
         android:textColor="@color/colorGrey"
         android:textSize="14sp" 
    />

A
AouledIssa

您可以使用 android:drawableLeft="@drawable/your_icon" 将可绘制对象设置为显示在左侧。要为可绘制对象设置填充,您应该使用 android:paddingLeftandroid:paddingRight 分别设置左/右填充。

android:paddingRight="10dp"
android:paddingLeft="20dp"
android:drawableRight="@drawable/ic_app_manager"

n
nicolas asinovich

只需重新制作:

<?xml version="1.0" encoding="utf-8"?>
<shape
        xmlns:android="http://schemas.android.com/apk/res/android">

    <corners android:radius="40dp"/>

    <solid android:color="@android:color/white"/>

</shape>

<layer-list
        xmlns:android="http://schemas.android.com/apk/res/android">
    <item
            android:right="@dimen/_2dp"
            android:left="@dimen/_2dp"
            android:bottom="@dimen/_2dp"
            android:top="@dimen/_2dp"
            >
        <shape
                xmlns:android="http://schemas.android.com/apk/res/android">

            <corners android:radius="40dp"/>

            <solid android:color="@android:color/white"/>

        </shape>
    </item>

</layer-list>

u
user3344964

如果可绘制资源的大小是固定的,您可以这样做:

<Button
    android:background="@drawable/rounded_button_green"
    style="?android:attr/selectableItemBackground"
    android:layout_height="wrap_content"
    app:layout_widthPercent="70%"
    android:drawableRight="@drawable/ic_clear_black_24dp"
    android:paddingRight="10dp"
    android:paddingLeft="34dp"
    tools:text="example" />

这里的关键是:

    android:drawableRight="@drawable/ic_clear_black_24dp"
    android:paddingRight="10dp"
    android:paddingLeft="34dp"

也就是drawable资源加上paddingRight的大小就是paddingLeft。

You can see the result in this example


d
dkackman
textView.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(this,drawable),null,null,null);

addressTitleView.setCompoundDrawablePadding();

虽然此代码段可能会解决问题,但 including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。
这仅适用于文本视图而不是例如按钮,它还允许设置开始/结束 drwables
P
Philipe Steiff

尝试使用负填充

喜欢:

android:paddingLeft="-8dp"