我希望在RadioButton
中有一个摘要,就像CheckBoxPreference
上的摘要一样。
我试图扩展RadioButton
并使用类似的方法覆盖onDraw
方法,但我坚持所有计算以使其布局合理。
@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);
}
其中包含以下内容:
这真的是要走的路(感觉不是这样)或者我应该尝试一些完全不同的东西吗?
答案 0 :(得分: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
为文字添加额外的新行。这有点hacky但我无法想出一个更好的方法来让超类正确定位文本。
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;
}
你最终会看到一个带有摘要文字的漂亮单选按钮。但是,可能存在问题,包括多行文本和摘要。在这种意义上的改进意见是受欢迎的。