web-dev-qa-db-fra.com

Android: Comment changer la taille de CheckBox?

J'aimerais rendre CheckBox un peu plus petit/plus grand, comment puis-je faire cela?

79
alex2k8

Il vous suffit de définir les éléments dessinables associés et de les définir dans la case à cocher:

<CheckBox 
    Android:layout_width="wrap_content" 
    Android:layout_height="wrap_content"
    Android:text="new checkbox" 
    Android:background="@drawable/my_checkbox_background"
    Android:button="@drawable/my_checkbox" />

L'astuce consiste à définir les dessinables. Voici un bon tutoriel à ce sujet .

54
moraes

À partir de l’API Niveau 11, une autre approche existe:

<CheckBox
    ...
    Android:scaleX="0.70"
    Android:scaleY="0.70"
/>
126
alex2k8

Voici une meilleure solution qui ne coupe pas et/ou n’efface pas le dessin, mais ne fonctionne que si la case à cocher ne contient pas de texte (mais vous pouvez toujours avoir du texte, c’est plus compliqué, voir à la fin).

<CheckBox
    Android:id="@+id/item_switch"
    Android:layout_width="160dp"    <!-- This is the size you want -->
    Android:layout_height="160dp"
    Android:button="@null"
    Android:background="?android:attr/listChoiceIndicatorMultiple"/>

Le résultat:

A quoi ressemblaient les solutions précédentes avec scaleX et scaleY:

Vous pouvez avoir une case à cocher texte en ajoutant une TextView à côté, en ajoutant un écouteur de clic sur la présentation parent, puis en déclenchant la case par programme.

67
Antoine Bolvy

J'utilise

Android:scaleX="0.70" Android:scaleY="0.70"

ajuster la taille de la case à cocher

alors je mets des marges comme ça

Android:layout_marginLeft="-10dp"

pour ajuster l'emplacement de la case à cocher.

7
Richard

Voici ce que j'ai fait, premier set:

Android:button="@null" 

et aussi mis 

Android:drawableLeft="@drawable/selector_you_defined_for_your_checkbox"

puis dans votre code Java:

Drawable d = mCheckBox.getCompoundDrawables()[0];
d.setBounds(0, 0, width_you_prefer, height_you_prefer);
mCheckBox.setCompoundDrawables(d, null, null, null);

Cela fonctionne pour moi et j'espère que cela fonctionnera pour vous!

6
Chris.Zou

UPDATE: cela ne fonctionne qu'à partir de l'API 17 ...


Pour ajouter aux autres réponses brillantes déjà données, vous ne pouvez réduire la case à cocher que dans la taille du texte.

Selon ma réponse à cette question: - Comment pouvons-nous réduire la taille de la case à cocher s'il vous plaît me donner une idée


CheckBox tire sa hauteur du TEXT ainsi que de l'image.

Définissez ces propriétés dans votre XML:

Android:text=""
Android:textSize="0sp"

Bien sûr, cela ne fonctionne que si vous ne voulez pas de texte (a travaillé pour moi).

Sans ces changements, la CheckBox me laissait une grande marge autour de mon image, comme l'a mentionné Joe 

4

Vous pouvez essayer la solution suivante pour modifier la taille de la case à cocher personnalisée en définissant les propriétés suivantes sur Checkbox dans votre fichier de présentation. Travaillé pour moi

Android:button="@null"
Android:scaleX="0.8"
Android:scaleY="0.8"
Android:background="@drawable/custom_checkbox"

ajouter les lignes suivantes au fichier dessinable 

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item Android:state_checked="false"
      Android:drawable="@drawable/unchecked_img" />
<item Android:state_checked="true"
      Android:drawable="@drawable/checked_img" />
</selector>
0
Sagar

Supposons que votre XML original est:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true"
        Android:drawable="@drawable/tick_img" />
    <item Android:state_checked="false"
        Android:drawable="@drawable/untick_img" />
</selector>

ensuite, supprimez simplement Android:button="@drawable/xml_above" dans votre case à cocher xml et effectuez une mise à l'échelle dessinable par programme en Java (diminuez la taille 150 de la taille désirée au dp de votre choix):

CheckBox tickRememberPasswd = findViewById(R.id.remember_tick);

//custom selector size
Drawable drawableTick = ContextCompat.getDrawable(this, R.drawable.tick_img);
Drawable drawableUntick = ContextCompat.getDrawable(this, R.drawable.untick_img);
Bitmap bitmapTick = null;
if (drawableTick != null && drawableUntick != null) {
    int desiredPixels = Math.round(convertDpToPixel(150, this));

    bitmapTick = ((BitmapDrawable) drawableTick).getBitmap();
    Drawable dTick = new BitmapDrawable(getResources()
            , Bitmap.createScaledBitmap(bitmapTick, desiredPixels, desiredPixels, true));

    Bitmap bitmapUntick = ((BitmapDrawable) drawableUntick).getBitmap();
    Drawable dUntick = new BitmapDrawable(getResources()
            , Bitmap.createScaledBitmap(bitmapUntick, desiredPixels, desiredPixels, true));

    final StateListDrawable statesTick = new StateListDrawable();
    statesTick.addState(new int[] {Android.R.attr.state_checked},
            dTick);
    statesTick.addState(new int[] { }, //else state_checked false
            dUntick);
    tickRememberPasswd.setButtonDrawable(statesTick);
}

la méthode convertDpToPixel:

public static float convertDpToPixel(float dp, Context context) {
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * (metrics.densityDpi / 160f);
    return px;
}
0
林果皞

J'ai trouvé un moyen de le faire sans créer vos propres images. En d'autres termes, l'image système est en cours de mise à l'échelle. Je ne prétends pas que la solution est parfaite; si quelqu'un connaît un moyen de raccourcir certaines étapes, je serai heureux de savoir comment.

Premièrement, je mets ce qui suit dans la classe d’activité principale du projet (WonActivity). Ceci a été pris directement de Stack Overflow - merci les gars !

/** get the default drawable for the check box */
Drawable getDefaultCheckBoxDrawable()
{
  int resID = 0;

  if (Build.VERSION.SDK_INT <= 10)
  {
    // pre-Honeycomb has a different way of setting the CheckBox button drawable
    resID = Resources.getSystem().getIdentifier("btn_check", "drawable", "Android");
  }
  else
  {
    // starting with Honeycomb, retrieve the theme-based indicator as CheckBox button drawable
    TypedValue value = new TypedValue();
    getApplicationContext().getTheme().resolveAttribute(Android.R.attr.listChoiceIndicatorMultiple, value, true);
    resID = value.resourceId;
  }

  return getResources().getDrawable(resID);
}

Deuxièmement, j'ai créé une classe pour "redimensionner un dessinable". Veuillez noter qu'il est complètement différent du ScaleDrawable standard.

import Android.graphics.drawable.*;

/** The drawable that scales the contained drawable */

public class ScalingDrawable extends LayerDrawable
{
  /** X scale */
  float scaleX;

  /** Y scale */
  float scaleY;

  ScalingDrawable(Drawable d, float scaleX, float scaleY)
  {
    super(new Drawable[] { d });
    setScale(scaleX, scaleY);
  }

  ScalingDrawable(Drawable d, float scale)
  {
    this(d, scale, scale);
  }

  /** set the scales */
  void setScale(float scaleX, float scaleY)
  {
    this.scaleX = scaleX;
    this.scaleY = scaleY;
  }

  /** set the scale -- proportional scaling */
  void setScale(float scale)
  {
    setScale(scale, scale);
  }

  // The following is what I wrote this for!

  @Override
  public int getIntrinsicWidth()
  {
    return (int)(super.getIntrinsicWidth() * scaleX);
  }

  @Override
  public int getIntrinsicHeight()
  {
    return (int)(super.getIntrinsicHeight() * scaleY);
  }
}

Enfin, j'ai défini une classe de case à cocher.

import Android.graphics.*;
import Android.graphics.drawable.Drawable;
import Android.widget.*;

/** A check box that resizes itself */

public class WonCheckBox extends CheckBox
{
  /** the check image */
  private ScalingDrawable checkImg;

  /** original height of the check-box image */
  private int origHeight;

  /** original padding-left */
  private int origPadLeft;

  /** height set by the user directly */
  private float height;

  WonCheckBox()
  {
    super(WonActivity.W.getApplicationContext());
    setBackgroundColor(Color.TRANSPARENT);

    // get the original drawable and get its height
    Drawable origImg = WonActivity.W.getDefaultCheckBoxDrawable();
    origHeight = height = origImg.getIntrinsicHeight();
    origPadLeft = getPaddingLeft();

    // I tried origImg.mutate(), but that fails on Android 2.1 (NullPointerException)
    checkImg = new ScalingDrawable(origImg, 1);
    setButtonDrawable(checkImg);
  }

  /** set checkbox height in pixels directly */
  public void setHeight(int height)
  {
    this.height = height;
    float scale = (float)height / origHeight;
    checkImg.setScale(scale);

    // Make sure the text is not overlapping with the image.
    // This is unnecessary on Android 4.2.2, but very important on previous versions.
    setPadding((int)(scale * origPadLeft), 0, 0, 0);

    // call the checkbox's internal setHeight()
    //   (may be unnecessary in your case)
    super.setHeight(height);
  }
}

C'est tout. Si vous mettez une WonCheckBox dans votre vue et appliquez setHeight (), l'image de la case à cocher sera de la bonne taille.

0
user1334767

utilisez ce code.

en disposition:

<CheckBox
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:button="@drawable/my_checkbox"  *** here
        Android:checked="true"/>

ajouter un nouveau dessinable: my_checkbox.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item
    Android:state_checked="false"
    Android:drawable="@drawable/checkbox_off_background"/>

<item
    Android:state_checked="true"
    Android:drawable="@drawable/checkbox_on_background"/>

et finissent par créer 2 tirables:

checkbox_off_background.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item>
    <shape Android:shape="rectangle">
        <size
            Android:height="25dp"   *** your size
            Android:width="25dp"/>
    </shape>
</item>

<item Android:drawable="@Android:drawable/checkbox_off_background"/>

et aussi, checkbox_on_background.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item>
    <shape Android:shape="rectangle">
        <size
            Android:height="25dp"
            Android:width="25dp"/>
    </shape>
</item>

<item Android:drawable="@Android:drawable/checkbox_on_background"/>

0
Ali Bagheri