DrawableLeft与文本居中

Mar*_*rek 5 android android-layout

我无法将drawableLeft图标居中。
我可以轻松地将图标放在文本的左侧,但是如果将重力设置为居中,则只有文本居中,而没有图标。

<Button
    android:id="@+id/patient_list_button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/patientList"
    android:drawableLeft="@drawable/ic_icon_two_heads"
    android:layout_marginBottom="15dp"
    style="@style/darkBlueButtonWithImage"/>
Run Code Online (Sandbox Code Playgroud)

这就是我要的:
在此处输入图片说明
这就是我所拥有的:
在此处输入图片说明

<style name="darkBlueButtonWithImage">
    <item name="android:drawablePadding">10dp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:paddingLeft">10dp</item>
    <item name="android:background">@drawable/radius_dark_blue_button</item>
    <item name="android:gravity">center_vertical|left</item>
    <item name="android:drawableTint">@color/white</item> <!-- has to be set in activity.java -->
</style>
Run Code Online (Sandbox Code Playgroud)

我该如何实现?

KaM*_*yLL 9

最后,经过这么多年,我们有可能以简单直观的方式实现这种行为。所有你需要做的就是使用MaterialButton从谷歌材料库。然后使用带有图标的样式。之后,您可以使用app:iconGravity属性并将其设置为textStart

    <com.google.android.material.button.MaterialButton
        style="@style/Widget.MaterialComponents.Button.Icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Some text"
        app:iconGravity="textStart"
        app:icon="@drawable/some_icon" />
Run Code Online (Sandbox Code Playgroud)


4gu*_*71n 6

IMO最简单的解决方案:

yourButtonView.text = SpannableString(" ${getString(R.string.your_string)}").apply {
            setSpan(
                ImageSpan(requireContext(), R.drawable.your_icon),
                0,
                1,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            )
        }
Run Code Online (Sandbox Code Playgroud)

是不是有点老套?或许。它适用于每个按钮(MaterialButton、AppCompatButton、Button 等)吗?确实如此。

我更喜欢这个,而不是创建自定义视图或类似的东西的所有麻烦。