Android:CheckBoxのサイズを変更するには?


92

CheckBoxを少し小さく/大きくしたいのですが、どうすればよいですか?

回答:


57

関連するドローアブルを設定し、チェックボックスで設定するだけです:

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

コツは、ドローアブルの設定方法です。これについての良いチュートリアルがあります


11
異なるデバイスにはカスタムテーマがインストールされている場合があることに注意してください。独自のカスタム画像を配置してサイズを調整する場合は、(サイズの変更がない場合でも)アプリ内のすべてのチェックボックスを必ず置き換えてください。そうしないと、特定のデバイスでスタイルが混在する可能性があります。
DougW、2012

142

APIレベル11以降、別のアプローチがあります。

<CheckBox
    ...
    android:scaleX="0.70"
    android:scaleY="0.70"
/>

5
この手法は、テキストラベルもスケーリングします。これを補うために、テキストサイズを次のように調整しました。checkBox.TextSize =(int)(TEXT_SIZE / SCALE_FACTOR);
samis 2013年

5
これを増やして、たとえば「2.0」に拡大すると、大きくなりますが、画像が切り取られて、チェックボックスの右半分とテキストの左半分が表示されます。これを回避する方法はありますか?
Al Lelopath 2013

4
いいですね、それでも同じスペースが必要です。それを解決するために、次のように-veマージンを使用しました:android:layout_marginLeft = "-10dp"
M. Usman Khan

おそらくIDEのプレビューには表示されませんが、CheckBoxは実行時にスケーリングされます
Leo Droidcoder

ASデザインビューに表示されます。修正を必要としないものの単純な修正。APIまたはデバイスが影響すると思います。API 22でGennymotionデバイスを使用すると、0.8が最も高いY(水平LinearLayout)であるように見えます。一方、Elixoの場合、Onix Tabletは1でクリップしません
MikeT

97

これは、ドローアブルをクリップしたりぼかしたりせず、チェックボックスにテキスト自体がない場合にのみ機能するより優れたソリューションです(ただし、テキストを含めることはできますが、もっと複雑です。最後を参照してください)。

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

結果:

何と以前のソリューションscaleXscaleYのように見えました:

TextView横にを追加し、親レイアウトにクリックリスナーを追加して、チェックボックスをプログラムでトリガーすることにより、テキストチェックボックスを設定できます。


2
チェックボックスにテキストがある場合、背景の使用は機能しません。
Zach Green

@ZachGreenはい、確かに。チェックボックスにテキストがあったとしても機能しない可能性については考えていませんでした。答えを更新します
Antoine Bolvy

4
これは受け入れられたものよりもはるかに良い答えです。
vtlinh

160dpでは、粒子が粗く見えます。解像度が低すぎるようです
Gianluca Demarinis

このようなチェックボックスの色合いを設定するにはどうすればよいですか?
YTerle 2017

16

よく私は多くの答えを見つけましたが、UIのようにチェックボックス付きのテキストも必要な場合、テキストなしで問題なく機能しますここに画像の説明を入力してください

ここで私のUI要件に従って、TextSizeを増やすことはできないため、私が試した他のオプションは、scaleXとscaleY(チェックボックスを押します)と.png画像を含むカスタムxmlセレクターです(異なる画面サイズで問題が発生します)。

しかし、そのための別のソリューションがあります。それはベクタードローアブルです。

3つのステップで実行します。

ステップ1:これら3つのベクタードローアブルをドローアブルフォルダーにコピーする

checked.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
    android:fillColor="#FF000000"
    android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z" />
</vector>

un_checked.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
    android:fillColor="#FF000000"
    android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z" />
</vector>

Android Studioを使用している場合は、そこからこれらのベクタードローアブルを追加することもできます。ドローアブルフォルダーを右クリックし、[新規/ベクターアセット]を右クリックして、そこからこれらのドローアブルを選択します

ステップ2: check_boxのXMLセレクターを作成する

check_box_selector.xml

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/checked" android:state_checked="true" />
<item android:drawable="@drawable/un_checked" />
</selector>

ステップ3:ドローアブルをチェックボックスに設定する

<CheckBox
android:id="@+id/suggectionNeverAskAgainCheckBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:button="@drawable/check_box_selector"
android:textColor="#FF000000"
android:textSize="13dp"
android:text="  Never show this alert again" />

今のように:

ここに画像の説明を入力してください


幅と高さ、またはviewportHeightとviewportWidthとfillColorも変更できます。


お役に立てれば幸いです。


2
私の場合、設定android:button="@null"android:background="@drawable/check_box_selector"てチェックボックスのサイズを調整する必要がありました。
ArturSzymański2018年

このアプローチは
パディングを

9

私が使う

android:scaleX="0.70" android:scaleY="0.70"

チェックボックスのサイズを調整する

次に、このようにマージンを設定します

android:layout_marginLeft="-10dp"

チェックボックスの位置を調整します。


Bro、それはそれを小さくします-私の場合、マージンは機能しません。チェックボックスの画像は173 x 93です-チェックボックスのサイズはまだそのスペースを占めています。Antoine Bolvyは、私の意見に対してより柔軟なソリューションです。
Alexey Shevelyov 16

6

これが私がしたこと、最初のセットです:

android:button="@null"

そしてまたセット

android:drawableLeft="@drawable/selector_you_defined_for_your_checkbox"

次にあなたのJavaコードで:

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

それは私にとってはうまくいき、うまくいけばあなたのためにうまくいくでしょう!


4

更新:これはAPI 17以降でのみ機能します...


既に与えられている他の素晴らしい答えに追加するには、テキストサイズが許す限り、チェックボックスを小さくすることができます。

この質問に対する私の回答に従って:- チェックボックスのサイズをどのように縮小できますか?


CheckBox TEXTと画像からその高さを導き出します。

これらのプロパティをXMLに設定します。

android:text=""
android:textSize="0sp"

もちろん、これはテキストが必要ない場合にのみ機能します(私のために機能しました)。

これらの変更がなければCheckBox、ジョーが言ったように、私の画像の周りに大きなマージンが与えられました


2

レイアウトファイルでcustom checkbox次のプロパティをCheckboxに設定することにより、次の解決策を試してサイズを変更できます。私のために働いた

android:scaleX = "0.8" android:scaleY = "0.8"

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

ドローアブルファイルに次の行を追加する

<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

独自の画像を作成せずにそれを行う方法を見つけました。つまり、システムイメージはスケーリングされています。解決策が完璧であるとは思わない。いくつかのステップを短縮する方法を知っている人がいれば、私は喜んでその方法を見つけます。

まず、プロジェクトのメインアクティビティクラス(WonActivity)に以下を配置します。これはスタックオーバーフローから直接取得されました。ありがとうございました

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

次に、「ドローアブルをスケーリングする」クラスを作成しました。標準のScaleDrawableとは完全に異なることに注意してください。

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

最後に、チェックボックスクラスを定義しました。

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

それでおしまい。WonCheckBoxをビューに配置してsetHeight()を適用すると、チェックボックス画像は適切なサイズになります。


0

このコードを使用します。

レイアウト:

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

新しいドローアブルを追加: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"/>

そして最後に2つのドローアブルを作成します:

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

また、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

元のxmlが次のとおりであるとします。

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

次にandroid:button="@drawable/xml_above"、チェックボックスのxmlを削除し、Javaでプログラムでドローアブルスケーリングを実行します(150大きなサイズを目的のdpに減らします)。

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

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

私はそれを理解した私の要件に関連する答えを見つけることができませんでした。したがって、この答えは、チェックボックスドローアブルとテキストを別々にサイズ変更する、以下のようなテキスト付きのチェックボックス用です。

ここに画像の説明を入力してください

2つのPNG cb_checked.pngとcb_unchechecked.pngが描画可能なフォルダーに追加される必要があります

ここでcb_bg_checked.xmlを作成します

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/cb_checked"
        android:height="22dp" <!-- This is the size of your checkbox -->
        android:width="22dp"  <!-- This is the size of your checkbox -->
        android:right="6dp"   <!-- This is the padding between cb and text -->
        tools:targetApi="m"
        tools:ignore="UnusedAttribute" />
</layer-list>

そして、cb_bg_unchecked.xml

 <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
        <item android:drawable="@drawable/cb_unchechecked"
            android:height="22dp" <!-- This is the size of your checkbox -->
            android:width="22dp"  <!-- This is the size of your checkbox -->
            android:right="6dp"   <!-- This is the padding between cb and text -->
            tools:targetApi="m"
            tools:ignore="UnusedAttribute" />
    </layer-list>

次に、セレクターXMLチェックボックスを作成します。

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

次のように、layout.xmlを定義します。

<CheckBox
  android:id="@+id/checkbox_with_text"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:checked="true"
  android:button="@drawable/checkbox"
  android:text="This is text"
  android:textColor="@color/white"
  android:textSize="14dp" /> <!-- Here you can resize text -->

0

チェックボックスにカスタム画像を追加する場合は、ボタンをnullに設定し、解決するチェックボックスに背景を追加するだけです

 <CheckBox
    android:layout_width="22dp"
    android:layout_height="22dp"
    android:layout_marginLeft="-10dp"
    android:button="@null"
    android:background="@drawable/memory_selector"/>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.