2013-11-21 7 views
12

AlignmentSpanクラスを使用して、RadioButtonテキストの一部を右揃えにしようとしています。しかし、テキストが期待どおりに整列していないため、動作しません。ラジオボタンのテキストでAlignmentSpanが機能しない

SpannableStringBuilder builder = new SpannableStringBuilder(); 

builder.append(option.getLabel()); 

int start = builder.length() + 1; 

builder.append(" "); 
builder.append(price); 
builder.append("€"); 

int end = builder.length(); 

builder.setSpan(new AlignmentSpan.Standard(Alignment.ALIGN_OPPOSITE), start, end, 
     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); 

builder.setSpan(bss, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

コードからわかるように、正しく動作するStyleSpanも適用されます。

N.B RadioButtonandroid:layout_width="match_parent"

答えて

2

ランダムアドバイス、仕事をしたりしないことがありますがありますが、...あなたは、文字列内のUnicode制御文字を注入してみましたか? (不適切な)U + 200E、U + 200F、U + 202A ... U + 202Eなどの文字を使用すると、テキストレンダラーがLTRと混合されたRTLの一部であると納得させることができます。それが助けになるかどうか分からない場合は、とにかく別々の段落に物を入れる必要があるかもしれませんが、それは私が今考えている唯一のことです。

2

android:layout_width="_wrap_content"を一度お試しください。

、これを試してみて結果を教えてください....

final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); 

builder.setSpan(bss, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    int end = builder.length(); 

builder.setSpan(new AlignmentSpan.Standard(Alignment.ALIGN_OPPOSITE), start, end, 
     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

私は間違っていないメートル場合は、最初にあなたによって設定されたスパンをオーバーライドあります。だから一緒にスパンを設定してみてください。

+0

いや、私は 'AlignmentSpan'をovverridingていませんよ。 Btw、私はいくつかの組み合わせを試みたが、それは動作していません。 – rciovati

0

私は同じような問題がありました:どのようにTextViewの左右に並んだテキストを同じ行に組み合わせるか(RadioButtonもTextViewです)。私はReplacementSpanの使い方を見つけました。

アイデアは、テキストの末尾に1つの追加シンボル(実際に描画されない)を追加し、このシンボルにあなたが何でもできるようになるReplacementSpanを付け加えます - 追加のテキストを描画する例適切な場所で(右に揃えて) ReplacementSpanでは、追加のシンボルの幅を定義できます。このスペースは分割できません。

RightAlignLastLetterSpan.attach(
         textView, 
         "right_aligned_piece_of_text", 
         R.style.TextAppereance_of_your_right_aligned_text); 

それは3番目の引数として与えられたスタイルでスタイルのTextViewに2番目の引数として与えられたテキストを追加します。

ので、実装の私の変種このアイデアは、このように使用することができています。追加されたテキストは右揃えになります。ここで

がRightAlignLastLetterSpanの完全なソースです:

class RightAlignLastLetterSpan extends ReplacementSpan { 

    @SuppressWarnings("FieldCanBeLocal") private static boolean DEBUG = false; 

    private float textWidth = -1; 
    @Nullable private TextAppearanceSpan spanStyle; 
    @Nullable private String text; 
    @NonNull private TextView tv; 

    protected RightAlignLastLetterSpan(@NonNull TextView tv) {this.tv = tv;} 

    public static boolean attach(@Nullable TextView tv, @Nullable String text, @StyleRes int resourceTextAppearance) { 

     if (tv == null || isEmpty(text)) { 
      logWrongArg(); 
      return false; 
     } 

     RightAlignLastLetterSpan span = new RightAlignLastLetterSpan(tv); 
     span.setSpanStyle(new TextAppearanceSpan(tv.getContext(), resourceTextAppearance)); 
     span.setText(text); 

     SpannableString ss = new SpannableString(new StringBuffer(tv.getText()).append(" _")); 
     ss.setSpan(span, ss.length() - 1, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
     tv.setText(ss); 

     return true; 
    } 

    public void setSpanStyle(@Nullable TextAppearanceSpan spanStyle) { 

     textWidth = -1; 
     this.spanStyle = spanStyle; 
    } 

    public void setText(@Nullable String text) { 

     textWidth = -1; 
     this.text = text; 
    } 

    @Override 
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { 

     if (textWidth < 0) { 
      applyStyle(paint); 
      textWidth = isEmpty(this.text) ? 0 : paint.measureText(this.text); 
     } 

     return Math.round(textWidth); 
    } 

    @Override 
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { 

     if (textWidth == 0 || this.text == null) { 
      return; 
     } 

     int lineCount = tv.getLineCount(); 
     if (lineCount < 1) {return;} 

     Rect lineBounds = new Rect(); 
     int baseline = tv.getLineBounds(lineCount - 1, lineBounds); 
     lineBounds.offset(-tv.getPaddingLeft(), -tv.getPaddingTop()); 
     baseline -= tv.getPaddingTop(); 

     if (DEBUG) { 
      paint.setColor(Color.argb(100, 100, 255, 100)); 
      canvas.drawRect(lineBounds, paint); 

      paint.setColor(Color.argb(100, 255, 100, 100)); 
      canvas.drawRect(x, top, x + textWidth, bottom, paint); 
     } 

     applyStyle(paint); 

     canvas.drawText(this.text, lineBounds.right - textWidth, baseline, paint); 
    } 

    public void applyStyle(Paint paint) { 

     if (paint instanceof TextPaint && spanStyle != null) { 
      TextPaint tp = (TextPaint) paint; 
      spanStyle.updateDrawState(tp); 
     } 
    } 
} 
+0

Android:textAllCaps = "true"は他のSpannableのものを削除しています –

関連する問題