web-dev-qa-db-ja.com

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

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

86
alex2k8

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

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

トリックは、ドロアブルの設定方法です。 これに関する良いチュートリアルがあります

55
moraes

APIレベル11以降、別のアプローチが存在します。

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

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

<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を追加し、親レイアウトにクリックリスナーを追加し、プログラムでチェックボックスをトリガーします。

78
Antoine Bolvy

まあ、私は多くの答えを見つけましたが、私のUIのようなチェックボックス付きのテキストも必要な場合、テキストなしでうまく動作します enter image description here

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

しかし、そのための別の解決策があります、それはVector Drawable

3つの手順で行います。

ステップ1:Vector Drawableを描画可能フォルダーにコピーします

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

今のように:

enter image description here


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


それが役立つことを願っています!

11
Ajeet Choudhary

私が使う

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

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

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

Android:layout_marginLeft="-10dp"

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

9
Richard

最初に設定したのは次のとおりです。

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

それは私のために働いており、うまくいけばあなたのために働くでしょう!

6
Chris.Zou

[〜#〜] update [〜#〜]:これはAPI 17以降でのみ機能します...


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

この質問に対する私の答えに従って:- チェックボックスのサイズを小さくするにはどうすればよいか教えてください


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

XMLで次のプロパティを設定します。

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

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

これらの変更がなければ、ジョーが述べたように、CheckBoxは私のイメージの周りに大きなマージンを与えてくれました。

4

レイアウトファイルで次のプロパティをCheckboxに設定することで、カスタムチェックボックスのサイズを変更する次の解決策を試すことができます。

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
Sagar

元の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
林果皞

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

最初に、プロジェクトのメインアクティビティクラス(WonActivity)に以下を追加します。これは、Stack Overflowから直接取得されました-ありがとう

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

このコードを使用してください。

レイアウト内:

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