J'aimerais rendre CheckBox un peu plus petit/plus grand, comment puis-je faire cela?
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 .
À partir de l’API Niveau 11, une autre approche existe:
<CheckBox
...
Android:scaleX="0.70"
Android:scaleY="0.70"
/>
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.
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.
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!
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
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>
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;
}
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.
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"/>