2013-09-27 225 views
9

Tôi biết cách gạch chân văn bản trong chế độ xem văn bản. Nhưng làm thế nào để nhấn mạnh văn bản với một số màu sắc khác nhau? Gạch chân có thể được thực hiện với:Làm cách nào để gạch dưới văn bản trong TextView với một số màu khác với màu văn bản?

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

Hãy nói Format của tôi là màu đen và tôi muốn nhấn mạnh cùng với màu xanh, làm thế nào để làm điều đó? Cảm ơn trước.

+0

Tôi sợ bạn cần hai TextView cho điều đó! – dd619

+0

Bạn có thể sử dụng như thế này Email.setText (Html.fromHtml ("W:" + "" + Email1 + "")); Sử dụng mã màu bạn muốn. – khubaib

Trả lời

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

tạo màu sơn mới. và gán màu cho textview.

+0

** Color.RED ** là để chọn màu của sơn. –

+0

Điều này không hoạt động! –

+0

kiểm tra câu trả lời cập nhật của tôi –

3

Bạn có thể thử như sau:

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

Điều này cũng sẽ thay đổi màu của văn bản, tôi chỉ muốn đặt màu gạch dưới. Cảm ơn –

+0

xem bài đăng có thể giúp bạn. http://stackoverflow.com/questions/13238298/android-change-underline-color-from-an-edittext-dynamically – GrIsHu

2

Nếu bạn là fan hâm mộ của một XML. Hãy nhìn vào giải pháp của tôi:

Tạo một selector selector_edittext_white.xml trong thư mục 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> 

Sau đó, thiết lập EditText bạn

android:background="@drawable/selector_edittext_white" 

Trong bối cảnh trên, màu sắc của gạch dưới là trắng, và bạn có thể di chuyển nó bằng cách thay đổi android:bottom ở trên là "-15dp". Trong trường hợp đó là biến mất, cố gắng thiết lập EditText bạn lề dưới như thế này

android:layout_marginBottom="5dp" 
8

tôi đã cùng một vấn đề và tôi đã stumbled khi Layout lớp khi đọc một số bài viết khác để làm điều này trên EditText. Nó cung cấp mọi thứ bạn cần để thực hiện điều này bằng cách vẽ thủ công gạch dưới bằng canvas.

Trước tiên tôi định nghĩa các thuộc tính tùy chỉnh cho một tùy biến dễ dàng trong file layout XML

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

Và một tùy chỉnh TextView lớp

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

Sau đó, nó sử dụng rất đơn giản

<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"/> 

cuối cùng kết quả

  • dòng đa

    enter image description here
  • Độc dòng

    enter image description here
+0

làm cách nào tôi có thể gạch dưới chỉ một văn bản cụ thể với chế độ xem tùy chỉnh này, không có khả năng hiển thị và khác .... – TheGreat004

2

tôi không thể thêm một bình luận nào, vì vậy tôi đăng như một câu trả lời để thay thế.

Tôi chỉ muốn nói rằng câu trả lời của Bojan Kseneman (https://stackoverflow.com/a/30717100/2771087) thật tuyệt vời. Có một vấn đề với nó mà tôi muốn sửa chữa, mặc dù.

Thay vì tìm vị trí cuối của ký tự cuối cùng trong một dòng, nó sẽ lấy phần cuối của ký tự cuối cùng thứ hai và sau đó thêm chiều rộng của ký tự đầu tiên trong dòng. Hai dòng này ở đây:

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

Thay vì điều này, getSecondaryHorizontal() có thể được sử dụng để lấy các phía đối diện của nhân vật, như trong:

x_stop = layout.getSecondaryHorizontal(lastCharInLine); 

Tuy nhiên, điều này cũng sẽ nhấn mạnh không gian tại cuối mỗi dòng cho các vùng văn bản nhiều dòng. Vì vậy, để khắc phục vấn đề đó, sử dụng mã như sau để bỏ qua nó trước khi tính toán x_stop:

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

Một giải pháp khác, lần này mà không cần mở rộng TextView (dựa trên một câu hỏi tôi đã viết trong một thời gian dài trước đây, here):

có thể vẽ được hiển thị như là gạch dưới, và có một khoảng thời gian cho chính bản văn:

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) 

} 

sử dụng:

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) 

Và kết quả:

enter image description here