为什么drawableStart的行为与Android文档不匹配?

时间:2013-03-12 00:08:30

标签: android button drawable spacing

我创建了一个非常基本的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button"
            android:drawableStart="@drawable/ic_launcher" />

    </LinearLayout>
</RelativeLayout>

根据the documentation for drawableStart

  

&#34;要绘制到文本开头的drawable。&#34;

但是,在Android 4.0.4手机上运行时,我会看到:

enter image description here

为什么图标和文字之间存在这么大的差距?根据{{​​3}},

  

&#34;使用Android 4.0(API级别14),您可以使用android:drawableStart属性在文本的开头放置一个drawable。&#34;

但这不是我观察到的行为。为什么属性不起作用?

2 个答案:

答案 0 :(得分:6)

很多关于开始和结束的误解 布局xml中的开始结束可替代以匹配布局方向(LTR或RTL)。

所以,当文档说:

  

“绘制到文本开头的可绘制内容。”

你必须阅读:

  

“根据布局方向绘制到视图开头的drawable”

答案 1 :(得分:1)

原因是因为drawableStart使按钮成为一个复合布局,即图像视图和TextView都包裹在一个'Button'中......

所以你看到的是ImageView被放置在Textview的前面。但是TextView仍然设置了它的默认布局属性,以便它将它绘制在左边的空间中心,从而产生间隙(注意它的居中通过将图像放在文本的开头留下的空间中)

所以你基本上需要覆盖TextView按钮的重力属性 -

android:gravity="center_vertical|center_horizontal|left"

请参阅下面的通知,您只需将按钮包裹在1个布局中,另一个是冗余的... 即RelativeLayout也可以是一个LinearLayout,因为你在布局中只有一个视图!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableStart="@drawable/ic_launcher"
        android:gravity="center_vertical|center_horizontal|left"
        android:text="@string/app_name" />

</RelativeLayout>