androidレイアウト:このタグとその子は、1つの<TextView />および複合ドローアブルで置き換えることができます


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。この状況は、複合ドローアブルで処理できるよりも複雑に見えます。ロメインの答えを受け入れなかった場合は、より詳細な答えを得た可能性があります。
AlbeyAmakiir 2012

回答:


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
気の利いた。しかし、60dip x 60dipに定義するなど、ドローアブルにプロパティを設定する必要がある場合はどうなりますか?
カイルクレッグ

4
ちょっと見て、私がしなければならなかったすべては検索でした。stackoverflow.com/a/6671544/1224741
QED

@KyleClegg、カスタムライブラリで可能です。私の答えを参照してください- stackoverflow.com/a/41347470/2308720
オレクサンドル

102

TextViewのメソッドを使用するか、を使用して、TextViewImageViewを1つにマージsetCompoundDrawable*()android:drawableLeftます。


30
それをどのように行うことができるかを示す例を教えていただけますか?ImageViewのすべての属性をandroid:drawableLeftでどのように調整できるかわかりません。ありがとう
pdilip 2010

1
scaleTypeのようなImageViews属性はどうですか?
neteinstein 2012

2
画像とテキストの間隔を広げるにはどうすればよいですか?
TharakaNirmana 2013年

2
setCompoundDrawable *()が機能しない。代わりにsetCompoundDrawablesWithIntrinsicBounds()を使用してください
Kimo_do

1
@Kimo_do setCompoundDrawable()は、ドローアブルをそのままでは処理しません。setBoundsそれを呼び出す必要があります(APIを参照)。これを設定するには、を使用して以前の境界を取得しTextView.getCompoundDrawables()、正しい描画可能インデックスにアクセスして、最後にを呼び出しgetBounds()ます。
Avinash R 2014


3

場合によっては、1つImageViewまたは複数のドローアブルに置き換える(または複数にする)ことが可能です。ネイティブAPIとこのTextViewRichDrawableライブラリを使用して複合ドローアブルに適用できるパラメーターは多くありませんが、LinearLayoutを使用する代わりに1つのTextViewを管理できる場合は、必ずそれを使用する必要がありますTextViewTextView

複合ドローアブルに適用できる属性とパラメーターのリスト:

サイズ:(はい、本当に):

<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

A LinearLayout含まImageViewTextViewより効率的に(単一の化合物描画可能として扱うことができる TextView使用して、drawableTopdrawableLeftdrawableRight および/またはdrawableBottomテキストに隣接する1つ以上の画像を描画する属性)。

2つのウィジェットがマージンで互いにオフセットされている場合、これはdrawablePadding属性で置き換えることができます。

Eclipseプラグインでこの変換を実行するlintクイックフィックスがあります。

From:Android Official API docs!


2

に追加tools:ignore="UseCompoundDrawables"<LinearLayout>ます。


1

上記のコードを実行すると、TextView内のテキストが正しく設定されません。質問に示されたものを達成するために、重力を中心に設定する必要があります。

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


これの利点は何でしょうか?そして、なぜ名前空間を2回設定するのですか?
イジェシャー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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.