2013-09-27 13 views
9

So come sottolineare il testo in una vista testuale. Ma come sottolineare il testo con un colore diverso? Sottolineato può essere fatto con:Come sottolineare il testo in TextView con un colore diverso da quello del testo?

TextView t = (TextView) findViewById(R.id.textview); 
t.setPaintFlags(t.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); 
t.setText("Underline Text"); 

diciamo la mia textcolor è nero e voglio sottolineare lo stesso con il colore blu, come fare? Grazie in anticipo.

+0

temo avete bisogno di due textviews per questo! – dd619

+0

È possibile utilizzare in questo modo Email.setText (Html.fromHtml ("W:" + "" + Email1 + "")); Usa il codice colore come desideri. – khubaib

risposta

0
Paint p = new Paint(); 
    p.setColor(Color.RED); 

    TextView t = (TextView) findViewById(R.id.textview); 
    t.setPaintFlags(p.getColor()); 
    t.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG); 
    t.setText("Underline Text");  

fare un nuovo colore della vernice. e assegnare la vernice alla vista testo.

+0

** Color.RED ** serve per scegliere il colore della vernice. –

+0

Questo non funziona! –

+0

controlla la mia risposta aggiornata –

3

si può provare, come di seguito:

String styledText = "<u><font color='red'>Underline Text</font></u>."; 
    textView.setText(Html.fromHtml(styledText), TextView.BufferType.SPANNABLE); 
+0

Questo cambierà anche il colore del testo, voglio solo impostare il colore della sottolineatura. Grazie –

+0

check out post che potrebbe aiutarti. http://stackoverflow.com/questions/13238298/android-change-underline-color-from-an-edittext-dynamically – GrIsHu

2

Se siete fan di un XML. Date un'occhiata a mia soluzione:

creare un selettore selector_edittext_white.xml nella cartella drawable

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:bottom="-15dp"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" 
     android:fromDegrees="0" 
     android:pivotX="0.5" 
     android:pivotY="0.5" 
     android:toDegrees="0"> 
     <shape android:shape="line"> 
      <stroke 
       android:width="0.5dp" 
       android:color="@android:color/white" /> 
     </shape> 
    </rotate> 
    </item> 
</layer-list> 

Quindi, impostare l'EditText

android:background="@drawable/selector_edittext_white" 

Nell'impostazione di sopra, il colore della sottolineatura è bianco, e puoi spostarlo cambiando android:bottom sopra è "-15dp". Nel caso in cui si tratta di scomparire, cercare di impostare le EditText margine inferiore come questo

android:layout_marginBottom="5dp" 
8

Ho avuto lo stesso problema e ho inciampato su Layout classe quando la lettura di alcuni altri posti per fare questo su EditText. Fornisce tutto ciò che è necessario per fare in modo che ciò avvenga disegnando manualmente la sottolineatura con la tela.

Prima ho definito gli attributi personalizzati per una facile personalizzazione nel file di layout XML

<declare-styleable name="UnderlinedTextView" > 
    <attr name="underlineWidth" format="dimension" /> 
    <attr name="underlineColor" format="color" /> 
</declare-styleable> 

E una consuetudine TextView classe

public class UnderlinedTextView extends AppCompatTextView { 

    private Rect mRect; 
    private Paint mPaint; 
    private float mStrokeWidth; 

    public UnderlinedTextView(Context context) { 
     this(context, null, 0); 
    } 

    public UnderlinedTextView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public UnderlinedTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context, attrs, defStyleAttr); 
    } 

    private void init(Context context, AttributeSet attributeSet, int defStyle) { 

     float density = context.getResources().getDisplayMetrics().density; 

     TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.UnderlinedTextView, defStyle, 0); 
     int underlineColor = typedArray.getColor(R.styleable.UnderlinedTextView_underlineColor, 0xFFFF0000); 
     mStrokeWidth = typedArray.getDimension(R.styleable.UnderlinedTextView_underlineWidth, density * 2); 
     typedArray.recycle(); 

     mRect = new Rect(); 
     mPaint = new Paint(); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setColor(underlineColor); 
     mPaint.setStrokeWidth(mStrokeWidth); 
    } 

    public int getUnderLineColor() { 
     return mPaint.getColor(); 
    } 

    public void setUnderLineColor(int mColor) { 
     mPaint.setColor(mColor); 
     invalidate(); 
    } 

    public float getUnderlineWidth() { 
     return mStrokeWidth; 
    } 

    public void setUnderlineWidth(float mStrokeWidth) { 
     this.mStrokeWidth = mStrokeWidth; 
     invalidate(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     int count = getLineCount(); 

     final Layout layout = getLayout(); 
     float x_start, x_stop, x_diff; 
     int firstCharInLine, lastCharInLine; 

     for (int i = 0; i < count; i++) { 
      int baseline = getLineBounds(i, mRect); 
      firstCharInLine = layout.getLineStart(i); 
      lastCharInLine = layout.getLineEnd(i); 

      x_start = layout.getPrimaryHorizontal(firstCharInLine); 
      x_diff = layout.getPrimaryHorizontal(firstCharInLine + 1) - x_start; 
      x_stop = layout.getPrimaryHorizontal(lastCharInLine - 1) + x_diff; 

      canvas.drawLine(x_start, baseline + mStrokeWidth, x_stop, baseline + mStrokeWidth, mPaint); 
     } 

     super.onDraw(canvas); 
    } 
} 

Allora è l'utilizzo è semplice

<some.package.UnderlinedTextView 
    android:id="@+id/tvTest" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_marginBottom="10dp" 
    android:layout_marginLeft="20dp" 
    android:layout_marginRight="20dp" 
    android:gravity="center" 
    android:text="This is a demo text" 
    android:textSize="16sp" 
    app:underlineColor="#ffc112ef" 
    app:underlineWidth="3dp"/> 

finale risultato

  • linea Multi

    enter image description here
  • linea singola

    enter image description here
+0

come posso sottolineare solo un testo specifico con questa visualizzazione personalizzata, senza spanne e altro .... – TheGreat004

2

non posso aggiungere un commento ancora, quindi sto postando come risposta invece.

Voglio solo dire che la risposta di Bojan Kseneman (https://stackoverflow.com/a/30717100/2771087) è fantastica. C'è un problema che mi piacerebbe correggere, però.

Invece di trovare la posizione finale dell'ultimo carattere in una riga, sta acquisendo la fine del penultimo carattere e quindi aggiungendo la larghezza del primo carattere nella riga. Queste due linee qui:

x_diff = layout.getPrimaryHorizontal(firstCharInLine + 1) - x_start; 
x_stop = layout.getPrimaryHorizontal(lastCharInLine - 1) + x_diff; 

Invece, getSecondaryHorizontal() possono essere utilizzati per afferrare il lato opposto del personaggio, come in:

x_stop = layout.getSecondaryHorizontal(lastCharInLine); 

Tuttavia, questo inoltre sottolineare lo spazio a la fine di ogni riga per le aree di testo su più righe. Quindi, per risolvere questo problema, utilizzare il codice simile al seguente per saltare passato prima di calcolare x_stop:

while (lastCharInLine != firstCharInLine && 
     Character.isWhitespace(getText().charAt(lastCharInLine - 1))) { 
    lastCharInLine--; 
} 
0

Un'altra soluzione, questa volta senza estendere TextView (basata su una domanda che ho scritto molto tempo fa, here):

avere un disegnabile per essere mostrato come la sottolineatura, e hanno una durata per il testo stesso:

text_underline.xml

<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="line"> 
    <padding android:bottom="10dp"/> 
    <stroke 
     android:width="1dp" 
     android:color="#3792e5"/> 
</shape> 

DrawableSpan.kt

class DrawableSpan(private val drawable: Drawable) : ReplacementSpan() { 
    private val padding: Rect = Rect() 

    init { 
     drawable.getPadding(padding) 
    } 

    override fun draw(canvas: Canvas, text: CharSequence, start: Int, end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint) { 
     val rect = RectF(x, top.toFloat(), x + measureText(paint, text, start, end), bottom.toFloat()) 
     drawable.setBounds(rect.left.toInt() - padding.left, rect.top.toInt() - padding.top, rect.right.toInt() + padding.right, rect.bottom.toInt() + padding.bottom) 
     canvas.drawText(text, start, end, x, y.toFloat(), paint) 
     drawable.draw(canvas) 
    } 

    override fun getSize(paint: Paint, text: CharSequence, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int = Math.round(paint.measureText(text, start, end)) 

    private fun measureText(paint: Paint, text: CharSequence, start: Int, end: Int): Float = paint.measureText(text, start, end) 

} 

utilizzo:

val text = getString(R.string.large_text) 
    val spannable = SpannableString(text) 
    spannable.setSpan(DrawableSpan(resources.getDrawable(R.drawable.text_underline)), 0, text.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) 
    textView.setText(spannable, TextView.BufferType.SPANNABLE) 

E il risultato:

enter image description here

Problemi correlati