TextViewでプログラムによって左のドローアブルを設定する


285

ここにxmlのtextViewがあります。

<TextView
        android:id="@+id/bookTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:drawableLeft="@drawable/checkmark"
        android:gravity="center_vertical"
        android:textStyle="bold"
        android:textSize="24dip"
        android:maxLines="1"
        android:ellipsize="end"/>

ご覧のとおり、DrawableLeftをxmlに設定しています。

コードでドローアブルを変更したいのですが。

とにかくこれをやろうとしていますか?または、テキストビューのコードにdrawableLeftを設定しますか?

回答:


781

あなたはsetCompoundDrawablesWithIntrinsicBounds(int left、int top、int right、int bottom)を使用できます

画像が不要な場合は0を設定します

左側のDrawableの例:

TextView textView = (TextView) findViewById(R.id.myTxtView);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon, 0, 0, 0);

ヒント:XML属性を知っているが、実行時にそれを使用する方法についての手掛かりがない場合。開発者用ドキュメントのそのプロパティの説明に移動してください。実行時にサポートされている場合は、関連メソッドが表示されます。つまり、DrawableLeftの場合


では、このメソッドのどこにドローアブルを設定すればよいですか?
coder_For_Life22、2011

1
+1 TextViewのandroid:drawableLeftをプログラムで設定するための機能。Thanx mate
Paresh Mayani 2012

35
ヒントを追加するための+1。これは、ドキュメントを使用するときに
開発者に

@BrainCrashそうですね、同じ名前の新しいメソッドと間違えました。
死刑執行人2014年

2
こんにちは私はこのメソッドを使用してドローアブルを設定していましたが、そのゲッターカウンターパートを見つけることができませんでした。複合テキストビューに描画可能オブジェクトがあるかどうかを確認する必要がありました。それ、どうやったら出来るの?と比較textview.getCompoundDrawablesRelative()[0]してみたmContext.getResources().getDrawable(R.drawable.my_drawable)
ラビ


6

TextViewでDrawableを設定するには、次のいずれかの方法を使用できます。

1- setCompoundDrawablesWithIntrinsicBounds(int、int、int、int)

2- setCompoundDrawables(Left_Drawable、Top_Drawable、Right_Drawable、Bottom_Drawable)

そして、あなたが使用できるリソースからドローアブルを取得するには:

getResources().getDrawable(R.drawable.your_drawable_id);

いいえ、setCompoundDrawablesWithIntrinsicBounds(int、int、int、int)は、独自のリンクからのAPI Levet 3です...
BrainCrash

1

Kotlinの使用:

拡張関数を作成するか、setCompoundDrawablesWithIntrinsicBounds直接使用することができます。

fun TextView.leftDrawable(@DrawableRes id: Int = 0) {
   this.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0)
}

ドローアブルのサイズを変更する必要がある場合は、この拡張関数を使用できます。

textView.leftDrawable(R.drawable.my_icon, R.dimen.icon_size)

fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int) {
    val drawable = ContextCompat.getDrawable(context, id)
    val size = resources.getDimensionPixelSize(sizeRes)
    drawable?.setBounds(0, 0, size, size)
    this.setCompoundDrawables(drawable, null, null, null)
}

本当に豪華にするには、サイズや色を変更できるラッパーを作成します。

textView.leftDrawable(R.drawable.my_icon, colorRes = R.color.white)

fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int = 0, @ColorInt color: Int = 0, @ColorRes colorRes: Int = 0) {
    val drawable = drawable(id)
    if (sizeRes != 0) {
        val size = resources.getDimensionPixelSize(sizeRes)
        drawable?.setBounds(0, 0, size, size)
    }
    if (color != 0) {
        drawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    } else if (colorRes != 0) {
        val colorInt = ContextCompat.getColor(context, colorRes)
        drawable?.setColorFilter(colorInt, PorterDuff.Mode.SRC_ATOP)
    }
    this.setCompoundDrawables(drawable, null, null, null)
}

0

Kotlin拡張+ドローアブルの周りのいくつかのパディング

fun TextView.addDrawable(drawable: Int) {
val imgDrawable = ContextCompat.getDrawable(context, drawable)
compoundDrawablePadding = 32
setCompoundDrawablesWithIntrinsicBounds(imgDrawable, null, null, null)
}

0

それには、XMLまたはJavaを使用できる2つの方法があります。静的で変更が不要な場合は、XMLで初期化できます。

  android:drawableLeft="@drawable/cloud_up"
    android:drawablePadding="5sp"

アイコンを動的に変更する必要がある場合は、イベントに基づいてアイコンを呼び出すことで実行できます

       textViewContext.setText("File Uploaded");
textViewContext.setCompoundDrawablesWithIntrinsicBounds(R.drawable.uploaded, 0, 0, 0);

-8
static private Drawable **scaleDrawable**(Drawable drawable, int width, int height) {

    int wi = drawable.getIntrinsicWidth();
    int hi = drawable.getIntrinsicHeight();
    int dimDiff = Math.abs(wi - width) - Math.abs(hi - height);
    float scale = (dimDiff > 0) ? width / (float)wi : height /
            (float)hi;
    Rect bounds = new Rect(0, 0, (int)(scale * wi), (int)(scale * hi));
    drawable.setBounds(bounds);
    return drawable;
}

これは質問の答えにはなりません。TextView関連の回答が必要です。
Rick
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.