Android-CheckBox와 텍스트 사이의 간격


256

CheckBox 컨트롤의 확인란과 관련 텍스트 사이에 패딩을 추가하는 쉬운 방법이 있습니까?

레이블이 여러 줄이기 때문에 앞 공백 만 추가 할 수 없습니다.

있는 그대로 텍스트가 확인란에 너무 가깝습니다. 대체 텍스트


1
간단한 해결책은 TextViewwith drawableLeft를 사용 drawablePadding하고 텍스트에 공간을 제공 하는 데 사용하는 것 입니다. 코드에서는 선택된 상태와 선택되지 않은 상태 만 토글합니다.
Muhammad Babar

방금 drawable과 텍스트 사이의 간격을 설정 해야하는 android : drawablePadding이라는 새로운 xml 속성을 발견했습니다. 나는 그것을 시도하지 않았지만이 문제에 대한 Google의 "사후"수정이라고 생각합니다.
페리 하트만

답변:


333

나는 내 자신의 질문에 대답하는 것을 싫어하지만이 경우에는 꼭해야한다고 생각합니다. 그것을 확인한 후 @Falmarri는 그의 대답과 함께 올바른 길을 가고있었습니다. 문제는 Android의 CheckBox 컨트롤이 이미 android : paddingLeft 속성을 사용하여 텍스트를 가져 오는 것입니다.

빨간색 선은 전체 CheckBox의 paddingLeft 오프셋 값을 보여줍니다.

대체 텍스트

XML 레이아웃에서 해당 패딩을 재정의하면 레이아웃이 엉망이됩니다. paddingLeft = "0"설정은 다음과 같습니다.

대체 텍스트

이것을 XML로 고칠 수는 없다는 것이 밝혀졌습니다. 코드로 작성했습니다. 다음은 하드 코딩 된 패딩 증가가 10dp 인 스 니펫입니다.

final float scale = this.getResources().getDisplayMetrics().density;
checkBox.setPadding(checkBox.getPaddingLeft() + (int)(10.0f * scale + 0.5f),
        checkBox.getPaddingTop(),
        checkBox.getPaddingRight(),
        checkBox.getPaddingBottom());

이것은 녹색 선이 패딩의 증가 인 다음을 제공합니다. 다른 장치는 확인란에 다른 드로어 블을 사용할 수 있으므로 값을 하드 코딩하는 것보다 안전합니다.

대체 텍스트

업데이트-사람들이 최근 아래 답변에서 언급 했듯이이 동작은 Jelly Bean (4.2)에서 분명히 변경되었습니다. 앱에서 실행중인 버전을 확인하고 적절한 방법을 사용해야합니다.

4.3 이상에서는 단순히 padding_left를 설정합니다. 자세한 내용은 htafoya의 답변을 참조하십시오.


108
자신의 질문에 대답하는 데 아무런 문제가 없습니다. 다른 사람이 나중에이 문제를 겪을 것입니다.
AndrewKS

4
설정만으로 무엇이 잘못 되었나요 paddingLeft="48sp"? 배율과 방향을 변경하더라도 여기에서 잘 작동합니다. 귀하의 코드는 항목 목록에 대해 잘못된 패딩 값을 제공했습니다.
harpo

5
@harpo-다른 장치 제조업체가 확인란에 다른 그래픽을 사용하지 않을 것이라는 보장이 없습니다. 즉, 하드 코딩 된 패딩이 다른 장치에서 시각적 레이아웃을 손상시킬 수 있습니다. 현재 패딩을 읽고 추가하기 때문에 문제가되지 않지만 한 번만 수행해야합니다.
DougW

2
@Blundell-반드시 그런 것은 아닙니다. 안드로이드의 오픈 소스. 장치 공급 업체는 완전히 다른 그래픽을 완전히 다른 크기로 대체 할 수 있습니다. 그들은 어떤 이유로 든 그런 일을 좋아합니다.
DougW

2
안타깝게도 getView()패딩이 끝없이 증가하므로 사용자 지정 어댑터 에서이 솔루션을 사용할 수 없습니다 (뷰를 재활용하는 경우). 이 문제를 해결하려면 다음과 같은 것을 사용해야했습니다 boolean isHackNeeded = Build.VERSION.SDK_INT < 17; float scale = context.getResources().getDisplayMetrics().density; if (isHackNeeded) {CheckBox rb = new CheckBox(context); this.PADDING = rb.getPaddingLeft() + Math.round(10.0f * scale); } else { this.PADDING = Math.round(10.0f * scale); }. 그리고 PADDING내가 팽창시키는 모든 CheckBox에 사용하십시오 :check.setPadding(PADDING, check.getPaddingTop() ...
Alex Semeniuk

133

@DougW 응답이 주어지면 버전을 관리하는 것이 더 간단합니다. 체크 박스보기에 추가합니다.

android:paddingLeft="@dimen/padding_checkbox"

dimen은 두 개의 값 폴더에 있습니다.

가치

<resources>

    <dimen name="padding_checkbox">0dp</dimen>

</resources>

values-v17 (4.2 젤리 빈)

<resources>

    <dimen name="padding_checkbox">10dp</dimen>

</resources>

맞춤 검사가 있습니다. 최상의 선택에 dps를 사용하십시오.


2
이것이 지금까지 가장 좋은 대답입니다. 그러나 values-v17API 17에서 수정 사항이 도입되었을 때 실제로 수정 되어야합니다 (위의 일부 게시물에 따라)
icecreamman

완벽한 대답은 단지 오래된 API (값 / 희미 함)에 대해서만 padding_checkbox를 0dip (API 10 여백이 이미 큰 경우)로 설정하고 htafoya가 제안한 것처럼 v17 10dip 값입니다.
Yar

70

android:drawableLeft대신 속성 을 사용하십시오 android:button. 드로어 블과 텍스트 사이에 패딩을 설정하려면 android:drawablePadding. 드로어 블을 위치 시키려면 android:paddingLeft.

<CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:button="@null"
        android:drawableLeft="@drawable/check_selector"
        android:drawablePadding="-50dp"
        android:paddingLeft="40dp"
        />

결과


1
안녕, 이것은 좋은 방법이지만 확인란의 기본 이미지의 여분의 왼쪽 여백 bcoz를 얻을 수 있습니다 ..
그것에

4
설정 android:background="@android:color/transparent"및 왼쪽 여백이 사라집니다
Madeuz

2
위의 코드는 내 라디오 버튼에 완벽하게 작동했으며 4.2 OS 경계에서 일관됩니다. 감사!
gnichola

1
이 순위는 훨씬 높아야합니다. @gnichola가 말했듯이 이것은 Android 버전에서 작동하며 매우 깨끗한 솔루션입니다. 다음과 같이 스타일을 작성하고 테마에 지정하십시오. 이렇게하면 스타일이 <item name="android:checkboxStyle">@style/CheckBox</item> 한 번 정의되고 한 번만 참조됩니다.
Rosomack

1
또한 background를 null (또는 사용자 정의 무언가)로 설정하십시오. 그렇지 않으면 lollipop +는 전체보기를 포괄하는 거대한 원 파급 효과를 얻습니다. <ripple> 태그를 사용하여 v21 버튼 드로어 블을 사용하여보다 적절한 리플을 다시 넣을 수 있습니다.
Tom

34

Android 4.2 Jelly Bean (API 17)은 buttonDrawable (오른쪽 가장자리)에서 텍스트 paddingLeft를 넣습니다. RTL 모드에서도 작동합니다.

4.2 paddingLeft 이전에 버튼은 DrawDable을 무시하고있었습니다.-CompoundButton 뷰의 왼쪽 가장자리에서 가져 왔습니다.

오래된 안드로이드에서는 paddingLeft를 buttonDrawable.width + requiredSpace로 설정하여 XML을 통해 해결할 수 있습니다. API 17에서 requiredSpace로만 설정하십시오. 예를 들어 차원 리소스를 사용하고 values-v17 리소스 폴더에서 재정의하십시오.

변경 사항은 android.widget.CompoundButton.getCompoundPaddingLeft ();


4
여기에서 유일한 정답입니다. 문제를 지적하고 간단한 솔루션을 제공하여 여러 상용 응용 프로그램에서 성공적으로 사용했습니다.
madej

1
buttonDrawable.width를 XML로 어떻게 얻거나 하드 코딩합니까?
Jared Kells

1
이전 코드에서이 문제를 해결하여을 제거했습니다 android:background="@android:color/transparent".
Sebek

받아 들여지는 대답은 훌륭하고 효과가 있지만 간단하고 효과적입니다. 이 답변을 수락해야합니다.
Reaz Murshed 5

27

예, 패딩을 추가하여 패딩을 추가 할 수 있습니다.

android:padding=5dp


4
이것은 실제로 작동합니다 ... 일종의. 하나의 경우 paddingLeft 만 필요하지만 모든 패딩은 아닙니다. 그러나 paddingLeft가 이미 약 40dp의 값으로 설정되어있는 것 같습니다. > 40dp로 설정하면 멀리 이동하고 <40dp로 설정하면 확인란 아래로 이동합니다. 나는 이것을 올바른 것으로 표시하고 그것에 대해 우려가 있기 때문에 다른 질문을 엽니 다.
DougW

글쎄, 나는 당신의 레이아웃을 보지 않고는 모른다.
Falmarri

예, 작동하지 않습니다. 특히 삼성 기기에 문제가 있습니다.
Ranjith Kumar

1
패딩 사운드를 추가하여 패딩 추가 합법적입니다!
Sermilion

21

코드가없는 깔끔한 디자인을 원하면 다음을 사용하십시오.

<CheckBox
   android:id="@+id/checkBox1"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:drawableLeft="@android:color/transparent"
   android:drawablePadding="10dp"
   android:text="CheckBox"/>

트릭은에 대해 색상을 투명하게 설정 android:drawableLeft하고에 값을 할당하는 것입니다 android:drawablePadding. 또한 투명도를 사용하면 색상 불일치와 같은 부작용없이 모든 배경색에이 기술을 사용할 수 있습니다.


16

API 17 이상에서는 다음을 사용할 수 있습니다.

android : paddingStart = "24dp"

API 16 이하에서는 다음을 사용할 수 있습니다.

android : paddingLeft = "24dp"


1
아주 좋은 대답입니다. 패딩이 확인란과 텍스트 사이에 공백을 제공하는 방법을 상상할 수 없습니다. 일반적으로 왼쪽 패딩은 구성 요소의 왼쪽을 의미합니다.
Mohamed Ibrahim

14

필자의 경우 XML에서 다음 CheckBox 속성을 사용 하여이 문제를 해결했습니다.

*

android : paddingLeft = "@ dimen / activity_horizontal_margin"

*


아주 좋은 대답입니다. 패딩이 확인란과 텍스트 사이에 공백을 제공하는 방법을 상상할 수 없습니다. 일반적으로 왼쪽 패딩은 구성 요소의 왼쪽을 의미합니다.
Mohamed Ibrahim

13

간단한 해결책, CheckBox 속성 에이 줄을 추가하고 원하는 간격 값으로 10dp바꿉니다.

android:paddingLeft="10dp"

10

나는 사람을 모른다, 그러나 나는 시험했다

<CheckBox android:paddingLeft="8mm" 전체 제어가 아닌 텍스트를 오른쪽으로 만 이동합니다.

잘 어울립니다.


1
최근에 이것을 시도하지 않았으므로 특정 장치 또는 최신 Android OS 버전에서 작동 할 가능성이 있습니다. 그래도 다른 설정에서 테스트하는 것이 좋습니다.이 질문을 할 때 확실히 작동하지 않았기 때문입니다.
DougW

나는 이것이 2.3.3과 4.2 사이에서 다르게 행동하는 것을보고있다 (변경 사이에 어디에서 발생했는지 확실하지 않음).
Nate

dp가 mm이 아닙니까?
Chrispix

10

더 나은 패딩을 갖기 위해 Android CheckBox를 확장하지 않는 이유는 무엇입니까? CheckBox를 사용할 때마다 코드로 수정하는 대신 고정 CheckBox를 대신 사용할 수 있습니다.

먼저 확장 확인란 :

package com.whatever;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.CheckBox;

/**
 * This extends the Android CheckBox to add some more padding so the text is not on top of the
 * CheckBox.
 */
public class CheckBoxWithPaddingFix extends CheckBox {

    public CheckBoxWithPaddingFix(Context context) {
        super(context);
    }

    public CheckBoxWithPaddingFix(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CheckBoxWithPaddingFix(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public int getCompoundPaddingLeft() {
        final float scale = this.getResources().getDisplayMetrics().density;
        return (super.getCompoundPaddingLeft() + (int) (10.0f * scale + 0.5f));
    }
}

일반 CheckBox를 만드는 대신 XML에서 두 번째로 확장 된 CheckBox를 만듭니다.

<com.whatever.CheckBoxWithPaddingFix
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello there" />

2
Jelly Bean에서 OS가 "고정"되었으므로 OS> 4.2 인 경우이를 방지하려면 'if'를 추가해야합니다.
Martin Marconcini

1
실제로> = 4.2 (17)입니다.
Aleks N.

6

방금 이것에 결론을 내 렸습니다.

사용자 정의 드로어 블이있는 경우 CheckBox를 재정의하고이 메서드를 추가하십시오.

@Override
public int getCompoundPaddingLeft() {

    // Workarround for version codes < Jelly bean 4.2
    // The system does not apply the same padding. Explantion:
    // http://stackoverflow.com/questions/4037795/android-spacing-between-checkbox-and-text/4038195#4038195

    int compoundPaddingLeft = super.getCompoundPaddingLeft();

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
        Drawable drawable = getResources().getDrawable( YOUR CUSTOM DRAWABLE );
        return compoundPaddingLeft + (drawable != null ? drawable.getIntrinsicWidth() : 0);
    } else {
        return compoundPaddingLeft;
    }

}

또는 시스템 드로어 블을 사용하는 경우 :

@Override
public int getCompoundPaddingLeft() {

    // Workarround for version codes < Jelly bean 4.2
    // The system does not apply the same padding. Explantion:
    // http://stackoverflow.com/questions/4037795/android-spacing-between-checkbox-and-text/4038195#4038195

    int compoundPaddingLeft = super.getCompoundPaddingLeft();

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
        final float scale = this.getResources().getDisplayMetrics().density;
        return compoundPaddingLeft + (drawable != null ? (int)(10.0f * scale + 0.5f) : 0);
    } else {
        return compoundPaddingLeft;
    }

}

답변 해주셔서 감사합니다 :)


4

이 동작은 Jelly Bean에서 변경된 것으로 보입니다. paddingLeft 트릭은 추가 패딩을 추가하여 텍스트를 너무 멀리 보이게합니다. 다른 사람은 알아?


업데이트 해 주셔서 감사합니다! 이에 대한 답변에 메모를 추가했습니다.
DougW


2
<CheckBox
        android:paddingRight="12dip" />

@AndrewKS-테스트되었습니다. 예상 한대로 이것은 확인란과 텍스트 사이가 아닌 전체 컨트롤에 패딩을 추가합니다.
DougW

텍스트를 별도의 TextView에 두는 것이 좋습니다.
AndrewKS

@AndrewKS-유용성에 대한 나쁜 생각. 사용자가 텍스트를 터치하고 확인란을 선택 / 선택 취소 할 수 있기를 원합니다. 또한 웹 페이지에서와 같은 방식으로 많은 접근성 기능을 손상시킵니다.
DougW

Bad idea for usability아닙니다. 확인란과 텍스트보기를 모두 선형 레이아웃에 넣고 해당 선형 레이아웃을 터치 가능하게 만듭니다.
Falmarri

1
-1이 답변은 이미지와 텍스트 사이의 간격에 관한 질문에서 제기 된 문제를 다루지 않습니다
David Laing

2

확인란 또는 단일 선택 단추에 대한 사용자 정의 이미지 선택기가있는 경우 다음과 같은 동일한 단추 및 배경 특성을 설정해야합니다.

            <CheckBox
                android:id="@+id/filter_checkbox_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:button="@drawable/selector_checkbox_filter"
                android:background="@drawable/selector_checkbox_filter" />

배경 속성으로 확인란 또는 라디오 버튼 패딩의 크기를 제어 할 수 있습니다.


아니요,이 작업을 수행 할 필요는 없습니다. 확인란 / 라디오 버튼 글리프와 다른 사용자 정의 배경이있는 경우에는 허용되지 않습니다.
andr

2

XML 파일에는 하나의 매개 변수 만 있으면됩니다.

android:paddingLeft="20dp"

2

0dpAndroid 9 API 28에서 minHeight 및 minWidth를 설정하는 것이 가장 깨끗하고 직접적인 솔루션이었습니다.

<CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="0dp"
        android:minWidth="0dp" />


1

내가 TextView한 것은 CheckBox내부와 (상대적) 내부 Layout입니다. TextView표시 I 사용자가보고 싶은, 그리고 그 텍스트 CheckBox텍스트가 없습니다. 그렇게 CheckBox하면 원하는 곳 의 위치 / 패딩을 설정할 수 있습니다 .


1

Galaxy S3 mini (android 4.1.2)와 동일한 문제가 있었고 CheckBox 대신 AppCompatCheckBox 를 확장하는 사용자 정의 확인란을 만들었습니다 . 이제 완벽하게 작동합니다.


0

이 크기에 패딩을 추가하려면 사용중인 이미지의 크기를 가져와야합니다. Android 내부에서는 src에 지정한 드로어 블을 가져 와서 그 크기를 사용합니다. 개인 변수이므로 getter가 없으므로 액세스 할 수 없습니다. 또한 com.android.internal.R.styleable.CompoundButton을 가져 와서 drawable을 가져올 수 없습니다.

따라서 자신 만의 스타일 지정 가능 (예 : custom_src)을 작성하거나 RadioButton 구현에 직접 추가 할 수 있습니다.

public class CustomRadioButton extends RadioButton {

    private Drawable mButtonDrawable = null;

    public CustomRadioButton(Context context) {
        this(context, null);
    }

    public CustomRadioButton(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomRadioButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mButtonDrawable = context.getResources().getDrawable(R.drawable.rbtn_green);
        setButtonDrawable(mButtonDrawable);
    }

    @Override
    public int getCompoundPaddingLeft() {
        if (Util.getAPILevel() <= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            if (drawable != null) {
                paddingLeft += drawable.getIntrinsicWidth();
            }
        }
        return paddingLeft;
    }
}

0

android:button속성에 드로어 블 선택기를 사용하는 경우 다음 android:constantSize="true"과 같이 기본 드로어 블 을 추가 및 / 또는 지정해야합니다.

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

그런 android:paddingLeft다음 확인란 xml에 속성 을 지정해야 합니다.

단점 :

레이아웃 편집기에서 api 16 이하의 확인란 아래에 텍스트가 표시됩니다.이 경우 제안 된 것과 같은 사용자 정의 확인란 클래스를 만들어서 수정할 수 있습니다 되었지만 api 레벨 16의 .

이론적 해석:

StateListDrawable#getIntrinsicWidth()호출이 내부적으로 사용 되므로 버그 CompoundButton이지만 < 0현재 상태가없고 일정한 크기가 사용되지 않으면 값을 반환 할 수 있습니다 .


0

이 문제를 극복하기 위해해야 ​​할 일은 안드로이드 XML 레이아웃에 추가 android:singleLine="true"하는 것 checkBox입니다.

<CheckBox 
   android:id="@+id/your_check_box"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:singleLine="true"
   android:background="@android:color/transparent"
   android:text="@string/your_string"/>

프로그래밍 방식으로 추가되는 특별한 것은 없습니다.


0

선택기에서 자체 드로어 블을 사용했을 때 확인란 이미지가 겹쳤습니다. 아래 코드를 사용 하여이 문제를 해결했습니다.

CheckBox cb = new CheckBox(mActivity);
cb.setText("Hi");
cb.setButtonDrawable(R.drawable.check_box_selector);
cb.setChecked(true);
cb.setPadding(cb.getPaddingLeft(), padding, padding, padding);

Alex Semeniuk 덕분에


0

이미지를 변경 하여이 문제로 끝납니다. png 파일에 투명한 배경을 추가했습니다. 이 솔루션은 모든 API에서 훌륭하게 작동합니다.


0

늦었을 수도 있지만이 문제를 관리하는 유틸리티 방법을 만들었습니다.

이 메소드를 유틸리티에 추가하십시오.

public static void setCheckBoxOffset(@NonNull  CheckBox checkBox, @DimenRes int offsetRes) {
    float offset = checkBox.getResources().getDimension(offsetRes);
    setCheckBoxOffsetPx(checkBox, offset);
}

public static void setCheckBoxOffsetPx(@NonNull CheckBox checkBox, float offsetInPx) {
    int leftPadding;
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) {
        leftPadding = checkBox.getPaddingLeft() + (int) (offsetInPx + 0.5f);
    } else {
        leftPadding = (int) (offsetInPx + 0.5f);
    }
    checkBox.setPadding(leftPadding,
            checkBox.getPaddingTop(),
            checkBox.getPaddingRight(),
            checkBox.getPaddingBottom());
}

그리고 이렇게 사용하십시오 :

    ViewUtils.setCheckBoxOffset(mAgreeTerms, R.dimen.space_medium);

또는 이와 같이 :

    // Be careful with this usage, because it sets padding in pixels, not in dp!
    ViewUtils.setCheckBoxOffsetPx(mAgreeTerms, 100f);

-1

확인란의 텍스트를 조정하는 대신 다음 작업을 수행했으며 모든 장치에서 효과적이었습니다. 1) XML에서 확인란과 텍스트보기를 서로 인접하게 추가하십시오. 약간의 거리를 유지하십시오. 2) 확인란 텍스트 크기를 0sp로 설정하십시오. 3) 확인란 옆의 해당 텍스트보기에 상대 텍스트를 추가하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.