android布局:此标记及其子代可以替换为一个<TextView />和一个复合drawable


116

当在特定的XML文件上运行布局时,得到以下信息:

 This tag and its children can be replaced by one <TextView/> 
and a compound drawable

以下xml代码应进行哪些更改:

<LinearLayout android:id="@+id/name_layout"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:background="@drawable/grouplist_single_left_grey_area" >
                <ImageView android:id="@+id/photo_image"
                    android:layout_width="@dimen/thumbnail_width"
                    android:layout_height="@dimen/thumbnail_height"
                    android:paddingBottom="5dip"
                    android:paddingTop="5dip"
                    android:paddingRight="5dip"
                    android:paddingLeft="5dip"
                    android:layout_marginRight="5dip"
                    android:clickable="true"
                    android:focusable="true"
                    android:scaleType="fitCenter"
                    android:src="@*android:drawable/nopicture_thumbnail"
                    android:background="@drawable/photo_highlight" />
                <TextView android:id="@+id/name"
                    android:paddingLeft="5dip"
                    android:layout_weight="1"
                    android:layout_width="0dip"
                    android:layout_height="wrap_content"
                    android:gravity="center_vertical"
                    android:textAppearance="?android:attr/textAppearanceLarge" />
            </LinearLayout>

这是在屏幕上的样子:

在此处输入图片说明

相机图标是默认图标。单击该按钮将为用户提供选择其他图像的选项。


3
+1,因为这种情况看起来比复合可绘制对象处理的复杂。如果您没有接受Romain的答案,那么您可能会得到更深入的答案。
AlbeyAmakiir 2012年

Answers:


153

为了扩展Romain Guy的答案,这是一个示例。

之前:

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:layout_marginTop="10dp"  
android:padding="5dp" >

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="My Compound Button" />

<ImageView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/my_drawable" />
</LinearLayout>

后:

<TextView  
    android:layout_marginTop="10dp"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="My Compound Button" 
    android:drawableRight="@drawable/my_drawable" android:padding="5dp" />

45
好漂亮 但是,如果我需要在drawable上设置属性,例如将其定义为60dip x 60dip,该怎么办?
凯尔·克莱格

4
嘿,我要做的就是搜索。stackoverflow.com/a/6671544/1224741
2012年

@KyleClegg,使用自定义库是可能的。见我的答案-stackoverflow.com/a/41347470/2308720
Oleksandr 2016年

102

合并TextViewImageView成一体,通过使用TextView的的setCompoundDrawable*()方法,或者使用android:drawableLeft


30
您能给我一个例子说明如何做到这一点吗?我不确定如何在android:drawableLeft中容纳ImageView中的所有属性。谢谢
pdilip

1
像scaleType这样的ImageViews属性呢?
neteinstein

2
如何增加图像和文本之间的距离?
TharakaNirmana

2
setCompoundDrawable *()不起作用,请改用setCompoundDrawablesWithIntrinsicBounds()
Kimo_do 2013年

1
@Kimo_do setCompoundDrawable()不会照常处理您的可绘制对象,您必须对其进行调用setBounds(请参阅API)。要进行设置,您可以使用来获取先前的边界TextView.getCompoundDrawables(),访问正确的可绘制索引并最终调用getBounds()
Avinash R


3

有时可以用复合drawable 替换ImageView(或多个)和TextView一个TextView。使用本机API和此TextViewRichDrawable库可用于复合可绘制对象的参数并不多,但是如果您可以管理一个TextView而不是使用LinearLayout,则一定要使用它

可应用于复合可绘制对象的属性和参数列表:

大小:(是,确实):

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some text"
    app:compoundDrawableHeight="24dp"
    app:compoundDrawableWidth="24dp"/>

甚至将矢量资源设置为可绘制:

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some text"
    app:drawableTopVector="@drawable/some_vector_drawble"
    app:drawableEndVector="@drawable/another_vector_drawable" />

使用本机API的Drawable的填充android:drawablePadding-> 链接

这是一个例子:

textView丰富的可绘制


2

LinearLayout其含有ImageViewTextView可以作为一个化合物绘制被更有效地处理(单 TextView,使用drawableTopdrawableLeftdrawableRight 和/或drawableBottom属性来绘制邻近于文本的一个或多个图像)。

如果两个窗口小部件彼此之间有边距,则可以将其替换为drawablePadding属性。

在Eclipse插件中有一个皮棉快速修复程序可以执行此转换。

来自:Android官方API文档!


2

添加tools:ignore="UseCompoundDrawables"<LinearLayout>


1

当我按照上面的代码进行操作时,TextView中的文本设置不正确。您需要将其重力设置为中心,以实现所询问的内容。

文本视图如下所示:

   <TextView
        android:id="@+id/export_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:drawableLeft="@drawable/up_arrow"
        android:drawableStart="@drawable/up_arrow"
        android:gravity="center|start"
        android:text="....."
        android:textSize="@dimen/font_size15" >
    </TextView>

0

如果您不想更改ImageView和TextView,则可以将AndroidManifest.xml中的版本更改为:

    <uses-sdk`
    android:minSdkVersion="8"
    android:targetSdkVersion="18" 
    />

如果您的版本是android:targetSdkVersion =“ 17”,请将其更改为“ 18”。

希望这会纠正。我做对了


-2

另一种方法是将ViewImage嵌入到另一个LinearLayout中(允许使用单独的id处理它):

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/blue_3"
            android:layout_gravity="center_horizontal"
            android:paddingTop="16dp" />
    </LinearLayout>
    <TextView 
        android:id="@+id/tvPrompt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:paddingTop="16dp"
        android:text="@string/xy" />


现在这有什么好处?为什么还要两次设置名称空间?
ygesher 2014年

-5
    This tag and its children can be replaced by one <TextView/> and a compound drawable



    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:contentDescription="."
        android:padding="3dp" 
        android:src="@drawable/tab_home_btn">
    </ImageView>

    <TextView
        android:id="@+id/textview"       
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="首页"
        android:textSize="10sp"
        android:textColor="#ffffff">
    </TextView>

</LinearLayout>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.