CheckBox 컨트롤의 확인란과 관련 텍스트 사이에 패딩을 추가하는 쉬운 방법이 있습니까?
레이블이 여러 줄이기 때문에 앞 공백 만 추가 할 수 없습니다.
있는 그대로 텍스트가 확인란에 너무 가깝습니다.
CheckBox 컨트롤의 확인란과 관련 텍스트 사이에 패딩을 추가하는 쉬운 방법이 있습니까?
레이블이 여러 줄이기 때문에 앞 공백 만 추가 할 수 없습니다.
있는 그대로 텍스트가 확인란에 너무 가깝습니다.
답변:
나는 내 자신의 질문에 대답하는 것을 싫어하지만이 경우에는 꼭해야한다고 생각합니다. 그것을 확인한 후 @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의 답변을 참조하십시오.
paddingLeft="48sp"
? 배율과 방향을 변경하더라도 여기에서 잘 작동합니다. 귀하의 코드는 항목 목록에 대해 잘못된 패딩 값을 제공했습니다.
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() ...
@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를 사용하십시오.
values-v17
API 17에서 수정 사항이 도입되었을 때 실제로 수정 되어야합니다 (위의 일부 게시물에 따라)
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"
/>
android:background="@android:color/transparent"
및 왼쪽 여백이 사라집니다
<item name="android:checkboxStyle">@style/CheckBox</item>
한 번 정의되고 한 번만 참조됩니다.
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 ();
android:background="@android:color/transparent"
.
예, 패딩을 추가하여 패딩을 추가 할 수 있습니다.
android:padding=5dp
코드가없는 깔끔한 디자인을 원하면 다음을 사용하십시오.
<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
. 또한 투명도를 사용하면 색상 불일치와 같은 부작용없이 모든 배경색에이 기술을 사용할 수 있습니다.
API 17 이상에서는 다음을 사용할 수 있습니다.
android : paddingStart = "24dp"
API 16 이하에서는 다음을 사용할 수 있습니다.
android : paddingLeft = "24dp"
필자의 경우 XML에서 다음 CheckBox 속성을 사용 하여이 문제를 해결했습니다.
*
android : paddingLeft = "@ dimen / activity_horizontal_margin"
*
나는 사람을 모른다, 그러나 나는 시험했다
<CheckBox android:paddingLeft="8mm"
전체 제어가 아닌 텍스트를 오른쪽으로 만 이동합니다.
잘 어울립니다.
더 나은 패딩을 갖기 위해 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" />
방금 이것에 결론을 내 렸습니다.
사용자 정의 드로어 블이있는 경우 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;
}
}
답변 해주셔서 감사합니다 :)
확인 표시와 텍스트 사이에 공백이있는 경우 :
android:paddingLeft="10dp"
그러나 확인 표시에 패딩 (약 5dp)이 포함되어 있기 때문에 10dp 이상이됩니다. 패딩 을 제거하려면 Android CheckBox 주변에서 패딩을 제거하는 방법을 참조하십시오 .
android:paddingLeft="-5dp"
android:layout_marginStart="-5dp"
android:layout_marginLeft="-5dp"
// or android:translationX="-5dp" instead of layout_marginLeft
<CheckBox
android:paddingRight="12dip" />
Bad idea for usability
아닙니다. 확인란과 텍스트보기를 모두 선형 레이아웃에 넣고 해당 선형 레이아웃을 터치 가능하게 만듭니다.
확인란 또는 단일 선택 단추에 대한 사용자 정의 이미지 선택기가있는 경우 다음과 같은 동일한 단추 및 배경 특성을 설정해야합니다.
<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" />
배경 속성으로 확인란 또는 라디오 버튼 패딩의 크기를 제어 할 수 있습니다.
사용자 정의 버튼을 만드는 경우 (예 : 체크 박스 튜토리얼 모양 변경 참조)
그런 다음 이미지 중앙에 하나 이상의 투명 픽셀 열을 추가하여 btn_check_label_background.9.png의 너비를 늘리십시오. 9 패치 마커는 그대로 둡니다.
Galaxy S3 mini (android 4.1.2)와 동일한 문제가 있었고 CheckBox 대신 AppCompatCheckBox 를 확장하는 사용자 정의 확인란을 만들었습니다 . 이제 완벽하게 작동합니다.
이 크기에 패딩을 추가하려면 사용중인 이미지의 크기를 가져와야합니다. 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;
}
}
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
현재 상태가없고 일정한 크기가 사용되지 않으면 값을 반환 할 수 있습니다 .
이 문제를 극복하기 위해해야 할 일은 안드로이드 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"/>
프로그래밍 방식으로 추가되는 특별한 것은 없습니다.
선택기에서 자체 드로어 블을 사용했을 때 확인란 이미지가 겹쳤습니다. 아래 코드를 사용 하여이 문제를 해결했습니다.
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 덕분에
이미지를 변경 하여이 문제로 끝납니다. png 파일에 투명한 배경을 추가했습니다. 이 솔루션은 모든 API에서 훌륭하게 작동합니다.
늦었을 수도 있지만이 문제를 관리하는 유틸리티 방법을 만들었습니다.
이 메소드를 유틸리티에 추가하십시오.
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);
<CheckBox android:drawablePadding="16dip"
-드로어 블과 텍스트 사이의 패딩.
TextView
withdrawableLeft
를 사용drawablePadding
하고 텍스트에 공간을 제공 하는 데 사용하는 것 입니다. 코드에서는 선택된 상태와 선택되지 않은 상태 만 토글합니다.