실제로 솔루션은 onDraw
메서드를 재정의합니다. 내가 어떻게 그 일을 끝내 었는지.
생성자에서 요약 텍스트의 올바른 스타일 속성을 가져옵니다. 에
public SummaryRadioButton(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = getContext().getTheme()
.obtainStyledAttributes(
attrs,
new int[] { android.R.attr.textSize,
android.R.attr.textColor },
android.R.attr.textAppearanceSmall, 0);
textSize = a.getDimensionPixelSize(0, 15);
textColor = a.getColorStateList(1);
paint = new Paint(getPaint());
paint.setTextSize(textSize);
a.recycle();
}
onDraw
라인의 높이와베이스 라인의 수직 위치를 얻을 요약 텍스트의 정확한 시작 지점을 계산합니다. 라디오 버튼의 상태에 올바른 텍스트 색상을 사용하십시오.
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (summary != null && summary.length() > 0) {
int horizontalStartPosition = getCompoundPaddingLeft()
+ getCompoundDrawablePadding();
int verticalStartPosition = getBaseline() + getLineHeight();
paint.setColor(textColor.getColorForState(getDrawableState(), 0));
canvas.drawText((String) summary, horizontalStartPosition,
verticalStartPosition, paint);
}
}
setSummary
추가 줄 바꿈을 텍스트에 추가하십시오. 이것은 약간 해키지만 텍스트를 올바르게 배치하기 위해 수퍼 클래스를 만드는 더 좋은 방법을 알 수 없습니다.
public void setSummary(CharSequence summary) {
if (summary != null && summary.length() > 0) {
setText(getText() + "\n");
} else {
setText(getText());
}
if (summary == null && this.summary != null || summary != null
&& !summary.equals(this.summary)) {
this.summary = summary;
}
}
따라서, 우리는 요약이있을 때 새로운 라인을뿐만 아니라 getText
을 무시하고 제거해야합니다.
@Override
@CapturedViewProperty
public CharSequence getText() {
CharSequence text = super.getText();
if (summary != null && summary.length() > 0) {
text = text.subSequence(0, text.length() - 1);
}
return text;
}
요약 텍스트가있는보기 좋은 라디오 버튼으로 끝납니다. 하지만 여러 줄의 텍스트와 요약으로 문제가있을 수 있습니다. 그러한 의미에서의 개선을위한 아이디어는 환영합니다.