2013-01-09 1 views
3

RadioButton에 요약이 있고 싶습니다. CheckBoxPreference에있는 것과 같습니다.RadioButton에 환경 설정 요약을 추가하는 방법은 무엇입니까?

GPS satellites checkbox

은 내가 RadioButton을 연장하고이 같은으로 onDraw 메서드를 재정의하려고했지만, 나는 그것이 잘 배치 수 있도록 모든 계산에 갇혔어요.

RadioButton with summary

은 (그것이 아닌 것 같아) 정말 갈 방법이 아니면 내가 완전히 다른 무언가를 시도해야합니다 :

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    Paint paint = new Paint(); 
    int textSize = 20; 
    int horizontalStartPosition = getCompoundPaddingLeft() + getCompoundDrawablePadding(); 
    int verticalStartPosition = getBaseline() + getLineHeight(); 
    paint.setTextSize(textSize); 
    paint.setColor(Color.GRAY); 
    paint.setAntiAlias(true); 
    canvas.drawText(summary, horizontalStartPosition, verticalStartPosition, paint); 
} 

어떤이 같은 렌더링?

답변

3

실제로 솔루션은 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; 
} 

요약 텍스트가있는보기 좋은 라디오 버튼으로 끝납니다. 하지만 여러 줄의 텍스트와 요약으로 문제가있을 수 있습니다. 그러한 의미에서의 개선을위한 아이디어는 환영합니다.

관련 문제