9

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

<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

“要绘制到文本开头的drawable。”

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

在此处输入图像描述

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

“使用 Android 4.0(API 级别 14),您可以使用 android:drawableStart 属性在文本开头放置一个可绘制对象。”

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

4

2 回答 2

6

对开始和结束有很多误解。布局 xml 中的
开始结束可替代左右以匹配布局方向(LTR 或 RTL)。 因此,当文档说:

“要绘制到文本开头的drawable。”

你必须阅读:

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

于 2013-09-18T08:42:14.693 回答
0

原因是因为 drawableStart 使按钮成为复合布局,即图像视图和文本视图都包裹在一个“按钮”中......

因此,您所看到的是 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>
于 2013-03-12T02:21:32.083 回答