解決策は、メソッドをオーバーライドする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;
}
見栄えの良いラジオ ボタンに要約テキストが表示されます。ただし、複数行のテキストや要約では問題が発生する可能性があります。そういう意味での改善案は大歓迎です。