Android düğmesinde programlı olarak drawableLeft nasıl ayarlanır?


442

Dinamik olarak düğmeler oluşturuyorum. Önce XML kullanarak onları şekillendirdim ve aşağıdaki XML'yi alıp programatik hale getirmeye çalışıyorum.

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

Şimdiye kadar sahip olduğum şey bu. Çekilebilir dışında her şeyi yapabilirim.

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);

Yanıtlar:


1054

Bunu setCompoundDrawablesyapmak için yöntemi kullanabilirsiniz . Buradaki örneğe bakın . Bunu kullanmadan kullandım setBoundsve işe yaradı. Her iki şekilde de deneyebilirsiniz.

GÜNCELLEME : Bağlantı koparsa kodu buraya kopyalarsanız

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

veya

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

veya

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

@Varun, @Tigger: Bununla ilgili bir sorunum var: Dosya yöneticim, metin görünümleri içeren bir liste görünümünde klasörler ve bir klasör simgesi olarak gösteriyor drawableLeft. Burada, okuma izinleri olmayan bir klasörü tıkladığınızda "yasak simge" ayarlamak için önerilerinizi denedim ve işe yarıyor. Ancak, klasörleri değiştirdiğinizde ve bağdaştırıcı yeniden yüklendiğinde, yasak simgesi kalmaya devam eder (yani, drawableLeftyeniden çizilmez). Bir döngü yapmadan notifyDataSetChangedda nasıl başvuracağınızı biliyor musunuz drawableLeft? Teşekkürler!
Luis A. Florit

@ LuisA.Florit ListviewVeri değiştiğinde bir öğenin yeniden çizilmesiyle ilgili bir sorunuz olduğu anlaşılıyor - ki bu gerçekten bu soru veya cevapla ilgili değil. Yorum yapmak yerine soru göndermenizi öneririm.
Tigger

@Tigger: Ben de hilenizi kullanarak simgeye geri döndüm ve yasaklanmış direkler üzerinde bir döngü. Belki bu tüm ListView öğelerini yeniden çizmekten daha iyidir ... Yine de teşekkürler!
Luis A. Florit

3
Uygulamamda garip bir şey görüyorum. setCompoundDrawablesWithIntrinsicBounds( 0, 0, R.drawable.money, 0 )Ben Layout.xml içinde drawableRight tanımlarsanız, değil çalışır. İçerideki orijinal simgeyi ayarlarsam onCreate(), değişiklik çalışır. API 19 ile ilgili olabilir mi?
Ocak'ta enjekte

Örnek bağlantı açılmıyor. Alternatif bir bağlantı var mı?
Yogesh Umesh Vaity

100

Bunu da deneyebilirsiniz

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

4
R.drawable.smiley son 0 yerine (ilk parametre) son olmamalıdır, çünkü bu yöntemin tanımı: {public void setCompoundDrawablesWithIntrinsicBounds (int sol, int üst, int sağ, int alt)}
arniotaki

Bunun etrafına nasıl dolgu ekleyebilirim? Çekilebilir ve metin arasında bu şekilde çok fazla dolgu yoktur.
AdamMc331

16

Kotlin Version

Düğmeye çekilebilir bir sol eklemek için aşağıdaki snippet'i kullanın:

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

.

Important Point in Using Android Vector Drawable

Çekilebilir bir android vektör kullanıyorsanız ve 21 yaşından küçük API için geriye dönük uyumluluğa sahip olmak istiyorsanız , aşağıdaki kodları ekleyin:

Uygulama düzeyinde build.gradle:

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

Uygulama sınıfında:

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
    }

}

Benim için de çalışmanın daha basit bir yolu: button.setCompoundDrawablesWithIntrinsicBounds (getDrawable (R.drawable.ic_favorite_white_16dp), null, null, null)
juangalf 12:19

2
Haklısınız, ancak Context#.getDrawable(resId)kullanımdan kaldırılmıştır, bu nedenle kullanmak bazı sorunlara neden olabilir.
aminografi

Ben yok çünkü Uygulama sınıfına eklemeden çalışır.
Mark Delphi

15

Benim için çalıştı:

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

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

4

Bunu ben yaptım:

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

Eğer kullanıyorsanız drawableStart , drawableEnd , drawableTop veya drawableBottom ; " setCompoundDrawablesRelativeWithIntrinsicBounds " öğesini kullanmalısınız

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

3

Benim için çalıştı. Sağda çekilebilir ayarlamak için

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

2

@ Jérémy Reynaud'un işaret ettiği gibi, bu cevapta açıklandığı gibi , diğer çekilebilirlerin (üst, sağ ve alt) değerlerini değiştirmeden sol çekmeceyi ayarlamanın en güvenli yolu setCompoundDrawablesWithIntrinsicBounds ile düğmeden önceki değerleri kullanmaktır :

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]);

Böylece önceki tüm çekilebilir kartlarınız korunacaktır.


2

Düzenleme metninde sol simgenin rengini değiştirmenin ve sol tarafa ayarlamanın yolu aşağıdadır.

 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

Yardımcı olabilir:

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 Uzantısı Ekleme

Bunu sık sık yapacaksanız, bir uzantı eklemek kodunuzu daha okunabilir hale getirir. Düğme TextView öğesini genişletir; Daha dar olmak istiyorsanız Button tuşunu kullanın.

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

Uzantıyı kullanmak için

view.leftDrawable(R.drawable.my_drawable)

Ne zaman temizlemeniz gerekiyorsa, bir param geçirmeyin veya başka bir uzantı yapmayın removeDrawables


0

Bunu dene:

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

Bunu dene:

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

myEdtiText.setCompoundDrawablesWithIntrinsicBounds (R.drawable.smiley, 0, 0, 0); works
Debasish Ghosh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.