Как программно установить drawableLeft на кнопку Android?

Я динамически создаю кнопки. Сначала я создал их с использованием 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); 

Solutions Collecting From Web of "Как программно установить drawableLeft на кнопку Android?"

Для этого вы можете использовать метод setCompoundDrawables . См. Пример здесь . Я использовал это без использования setBounds и он сработал. Вы можете попробовать в любом случае.

UPDATE : Копирование кода здесь означает, что ссылка идет вниз

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

Просто вы можете попробовать это и

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

Для меня это сработало:

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

Я сделал это:

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

Как @ Jérémy Reynaud, указывая, как описано в этом ответе , самый безопасный способ установить левую растяжку без изменения значений других чертежей (сверху, вправо и снизу), используя предыдущие значения с помощью кнопки с 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]); 

Таким образом, все ваши предыдущие доступные будут сохранены.

Попробуйте:

 ((Button)btn).getCompoundDrawables()[0].setAlpha(btn.isEnabled() ? 255 : 100); 
 String countryIso = objPrefs.getAddBusinessFlagCode(); countryIso = countryIso.toLowerCase(); add_business_country.setCompoundDrawablesWithIntrinsicBounds(getApplicationContext().getResources().getIdentifier("drawable/" + countryIso, null, getApplicationContext().getPackageName()), 0, 0, 0);