drawableStart的行为如何与Android文档不匹配?

我已经创build了一个非常基本的布局:

<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> 

根据drawableStart的文档 ,

“可以画到文本的开头。”

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

在这里输入图像说明

为什么图标和文字之间有这么大的差距? 根据这个答案 ,

“使用Android 4.0(API等级14),您可以使用android:drawableStart属性在文本的开始处放置一个绘图。”

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

Solutions Collecting From Web of "drawableStart的行为如何与Android文档不匹配?"

很多误区与开始和结束。
布局xml中的开始结束是左右替代以匹配布局方向(LTR或RTL)。

所以,当文档说:

“可以画到文本的开头。”

你必须阅读:

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

原因是因为drawableStarttypes使button成为一个复合的布局,即图像视图和TextView都包裹在一个“button”…

所以你所看到的是ImageView被放置在Textview的前面。然而,TextView仍然有它的默认的布局属性设置,以便它在它留下的空间中居中绘制它,因此间隙(注意它的中心在空间把图像放在文本的开头)

所以你基本上需要重写button的重力属性TextView –

android:gravity="center_vertical|center_horizontal|left"

看到下面的通知,你只需要button包装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>