プログラムでAndroidボタンにdrawableLeftを設定する方法は?


442

ボタンを動的に作成しています。最初にXMLを使用してスタイルを設定し、以下のXMLをプログラム化しようとしています。

<Button
    android:id="@+id/buttonIdDoesntMatter"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:text="buttonName"
    android:drawableLeft="@drawable/imageWillChange"
    android:onClick="listener"
    android:layout_width="fill_parent">
</Button>

これは私が今のところ持っているものです。ドローアブル以外は何でもできます。

linear = (LinearLayout) findViewById(R.id.LinearView);
Button button = new Button(this);
button.setText("Button");
button.setOnClickListener(listener);
button.setLayoutParams(
    new LayoutParams(
        android.view.ViewGroup.LayoutParams.FILL_PARENT,         
        android.view.ViewGroup.LayoutParams.WRAP_CONTENT
    )
);      

linear.addView(button);

回答:


1054

setCompoundDrawablesメソッドを使用してこれを行うことができます。こちらの例をご覧ください。私はこれを使用せずにこれを使用しましたがsetBounds、うまくいきました。どちらの方法でも試すことができます。

更新:リンクがダウンした場合のコードのコピー

Drawable img = getContext().getResources().getDrawable(R.drawable.smiley);
img.setBounds(0, 0, 60, 60);
txtVw.setCompoundDrawables(img, null, null, null);

または

Drawable img = getContext().getResources().getDrawable(R.drawable.smiley);
txtVw.setCompoundDrawablesWithIntrinsicBounds(img, null, null, null);

または

txtVw.setCompoundDrawablesWithIntrinsicBounds(R.drawable.smiley, 0, 0, 0);

@ Varun、@ Tigger:これに問題があります:私のファイルマネージャーは、リストビューにフォルダーを表示し、テキストビューとフォルダーアイコンをとして表示しますdrawableLeft。読み取り権限のないフォルダをクリックしたときに「禁止アイコン」を設定するための提案をここで試しましたが、機能します。ただし、フォルダーを変更してアダプターを再ロードすると、禁止されたアイコンが保持されます(つまり、drawableLeft再描画されません)。ループを行わずににnotifyDataSetChangedも申請する方法を知っdrawableLeftていますか?ありがとう!
Luis A. Florit 2013

@ LuisA.Florit Listviewデータが変更されたときのアイテムの再描画に関連する質問があるようですが、これはこの質問または回答には関係ありません。コメントではなく質問を投稿することをお勧めします。
Tigger

@Tigger:まあ、私もあなたのトリックを使用してアイコンを元に戻し、禁止されたディレクトリをループしました。たぶん、これはすべてのListViewアイテムを再描画するよりも優れています...とにかくありがとう!
Luis A. Florit 2013

3
アプリに何か奇妙なものが表示されます。setCompoundDrawablesWithIntrinsicBounds( 0, 0, R.drawable.money, 0 )私はlayout.xmlでdrawableRightを定義した場合、動作しません。内onCreate()に元のアイコンを設定すると、変更が機能します。API 19に関連していますか?
インジェクタ2014年

リンクの例は開いていません。代替リンクはありますか?
Yogesh Umesh Vaity 16

100

単にこれも試すことができます

txtVw.setCompoundDrawablesWithIntrinsicBounds(R.drawable.smiley, 0, 0, 0);

4
このメソッドの定義は次のとおりなので、R.drawable.smileyは最後ではなく最初の0(最初のパラメーター)の場所にある必要があります:{public void setCompoundDrawablesWithIntrinsicBounds(int left、int top、int right、int bottom)}
arniotaki

この周りにもパディングを追加するにはどうすればよいですか?この方法では、ドローアブルとテキストの間に多くのパディングはありません。
AdamMc331 2017

16

Kotlin Version

以下のスニペットを使用して、ボタンにドローアブルを左に追加します。

val drawable = ContextCompat.getDrawable(context, R.drawable.ic_favorite_white_16dp)
button.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)

Important Point in Using Android Vector Drawable

Androidベクタードローアブルを使用していて、21未満のAPIの下位互換性を確保したい場合は、次のコードを追加します。

アプリレベルbuild.gradle

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

アプリケーションクラス:

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
    }

}

私にも有効な簡単な方法:button.setCompoundDrawablesWithIntrinsicBounds(getDrawable(R.drawable.ic_favorite_white_16dp)、null、null、null)
juangalf

2
あなたは正しいですが、Context#.getDrawable(resId)非推奨であるため、使用すると問題が発生する可能性があります。
アミノグラフィー

アプリケーションクラスがないため、アプリケーションクラスを追加しなくても機能します。
Mark Delphi

15

私にとっては、うまくいきました:

button.setCompoundDrawablesWithIntrinsicBounds(com.example.project1.R.drawable.ic_launcher, 0, 0, 0);

13
myEdtiText.setCompoundDrawablesWithIntrinsicBounds(R.drawable.smiley, 0, 0, 0);

4

これは私がしました:

 // Left, top, right, bottom drawables.
            Drawable[] drawables = button.getCompoundDrawables();
            // get left drawable.
            Drawable leftCompoundDrawable = drawables[0];
            // get new drawable.
            Drawable img = getContext().getResources().getDrawable(R.drawable.ic_launcher);
            // set image size (don't change the size values)
            img.setBounds(leftCompoundDrawable.getBounds());
            // set new drawable
            button.setCompoundDrawables(img, null, null, null);

4

drawableStartdrawableEnddrawableTop、またはdrawableBottomを使用している場合。「setCompoundDrawablesRelativeWithIntrinsicBounds」を使用する必要があります

edittext.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.anim_search_to_close, 0)

3

私のために働いた。右側にドローアブルを設定するには

tvBioLive.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_close_red_400_24dp, 0)

2

この回答で説明されているように、@JérémyReynaudが指摘しているように、他のドローアブル(上、右、下)の値を変更せずに左のドローアブルを設定する最も安全な方法は、setCompoundDrawablesWithIntrinsicBoundsでボタンの前の値を使用することです:

Drawable leftDrawable = getContext().getResources()
                          .getDrawable(R.drawable.yourdrawable);

// Or use ContextCompat
// Drawable leftDrawable = ContextCompat.getDrawable(getContext(),
//                                        R.drawable.yourdrawable);

Drawable[] drawables = button.getCompoundDrawables();
button.setCompoundDrawablesWithIntrinsicBounds(leftDrawable,drawables[1],
                                               drawables[2], drawables[3]);

したがって、以前のドローアブルはすべて保持されます。


2

以下は、エディットテキストの左側のアイコンの色を変更して左側に設定する方法です。

 Drawable img = getResources().getDrawable( R.drawable.user );
img.setBounds( 0, 0, 60, 60 );
mNameEditText.setCompoundDrawables(img,null, null, null);

int color = ContextCompat.getColor(this, R.color.blackColor);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    DrawableCompat.setTint(img, color);

} else {
    img.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}

1

役立つかもしれません:

TextView location;
location=(TextView)view.findViewById(R.id.complain_location);
//in parameter (left,top,right,bottom) any where you wnat to put
location.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.arrow,0);

1

Kotlin拡張機能を追加する

これを頻繁に行う場合は、拡張機能を追加するとコードが読みやすくなります。ボタンはTextViewを拡張します。幅を狭くしたい場合は、ボタンを使用します。

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

拡張機能を使用するには、単に呼び出す

view.leftDrawable(R.drawable.my_drawable)

クリアする必要があるときはいつでも、パラメータを渡したり、別の拡張機能を呼び出さないでください removeDrawables


0

これを試して:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
     fillButton[i].setBackground(getBaseContext().getResources().getDrawable(R.drawable.drawable_name));
}
else {
    fillButton[i].setBackgroundColor(Color.argb(255,193,234,203));
}

-8

これを試して:

((Button)btn).getCompoundDrawables()[0].setAlpha(btn.isEnabled() ? 255 : 100);

myEdtiText.setCompoundDrawablesWithIntrinsicBounds(R.drawable.smiley、0、0、0); 作品
Debasish Ghosh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.