3

にあるような要約を私の中に入れたいRadioButtonのですがCheckBoxPreference

GPS衛星チェックボックス

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);
}

これは次のようなものをレンダリングします:

要約付きのラジオボタン

これは本当に進むべき道ですか(そうではないように感じます)、それともまったく別のことを試してみる必要がありますか?

4

1 に答える 1

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;
}

見栄えの良いラジオ ボタンに要約テキストが表示されます。ただし、複数行のテキストや要約では問題が発生する可能性があります。そういう意味での改善案は大歓迎です。

于 2013-01-18T10:35:40.863 に答える