2012-08-05 36 views
9

Tôi đã sử dụng android:autoLink chỉ tốt cho các liên kết định dạng và như vậy, nhưng tôi cần sử dụng để tôi không thể sử dụng trong trường hợp này. Lý do là tôi thấy nó quá dễ dàng để nhấp vào một số điện thoại vô tình, vì vậy tôi sẽ đánh chặn các nhấp chuột với một xác nhận Dialog và sau đó gọi.Định dạng TextView trông giống như liên kết

Có cách nào dễ dàng để duy trì số điện thoại trong số TextView của tôi giống như một liên kết có thể nhấp bình thường không? Tôi chọc quanh mã nguồn Android, nhưng không thể tìm thấy bất kỳ phong cách cụ thể nào để tôi tham khảo.

+0

Một giải pháp sẽ được mở rộng ClickableSpan để làm xử lý tùy chỉnh của riêng bạn nhấn vào liên kết: http://developer.android.com/reference/android/text/style/ClickableSpan.html Cũng kiểm tra chủ đề này: http://stackoverflow.com/questions/11413399/open-textview-links-at-another-activity-not- mặc định trình duyệt – almalkawi

Trả lời

3
  • Bạn có thể tạo tệp tài nguyên colors.xml, chứa màu sắc. Hãy xem tại Colors
  • Nếu bạn muốn nhấn mạnh văn bản của bạn, sau đó xin hãy xem bài này: Underline
  • Đừng quên để thêm android:clickable="true" hoặc setClickable(true) để TextView của bạn để làm cho họ nhấp được!
3

Để gạch dưới văn bản của TextView của mình, bạn phải làm một cái gì đó như:

final TextView text = (TextView) findViewById(R.id.text); 

SpannableString string = new SpannableString("This is the uderlined text."); 
string.setSpan(new UnderlineSpan(), 0, string.length(), 0); 
text.setText(string); 

này nên làm việc. Hãy cho tôi biết về sự tiến bộ của bạn.

+0

chỉ cần thay thế nội dung bằng chuỗi và sau đó chỉ có mã của bạn sẽ hoạt động tốt. vì nội dung không có gì ở đây cả. –

+0

@RobiKumarTomar, Cảm ơn! Bạn hoàn toàn đúng. – yugidroid

3

Linkify là một lớp tuyệt vời, nó săn tìm các mẫu phức tạp như URL, số điện thoại, v.v. và biến chúng thành URLSpans. Thay vì viết lại các biểu thức chính quy hiện có, tôi đã mở rộng lớp URLSpan và tạo phương thức để nâng cấp chỉ URL của điện thoạiChuyển đến URL tùy chỉnhSpan có hộp thoại xác nhận.

Đầu tiên tôi mở rộng lớp URLSpan, ConfirmSpan:

class ConfirmSpan extends URLSpan { 
    AlertDialog dialog; 
    View mView; 

    public ConfirmSpan(URLSpan span) { 
     super(span.getURL()); 
    } 

    @Override 
    public void onClick(View widget) { 
     mView = widget; 

     if(dialog == null) { 
      AlertDialog.Builder mBuilder = new AlertDialog.Builder(widget.getContext()); 
      mBuilder.setMessage("Do you want to call: " + getURL().substring(4) + "?"); 
      mBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        openURL(); 
       } 
      }); 
      dialog = mBuilder.create(); 
     } 
     dialog.show(); 
    } 

    public void openURL() { 
     super.onClick(mView); 
    } 
} 

Tiếp phương pháp trao đổi trên các lớp tuổi khác nhau:

private void swapSpans(TextView textView) { 
    Spannable spannable = (Spannable) textView.getText(); 
    URLSpan[] spans = textView.getUrls(); 
    for(URLSpan span : spans) { 
     if(span.getURL().toString().startsWith("tel:")) { 
      spannable.setSpan(new ConfirmSpan(span), spannable.getSpanStart(span), spannable.getSpanEnd(span), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      spannable.removeSpan(span); 
     } 
    } 
} 

Cuối cùng tất cả các bạn cần làm là tạo một TextView với thuộc tính autoLink:

android:autoLink="phone" 

Và hãy nhớ gọi phương thức swapSpans(). Hiểu rằng tôi đã viết điều này cho vui, có thể có các phương pháp khác để làm điều này nhưng tôi không biết về chúng vào lúc này. Hi vọng điêu nay co ich!

+0

Cảm ơn bạn, điều này có vẻ rất đẹp! Tôi sẽ cố gắng thực hiện nó sớm và xem nó như thế nào. :) –

8

Đây là giải pháp ngắn nhất:

final CharSequence text = tv.getText(); 
final SpannableString spannableString = new SpannableString(text); 
spannableString.setSpan(new URLSpan(""), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
tv.setText(spannableString, TextView.BufferType.SPANNABLE); 

Đáng buồn thay, ảnh hưởng của cách kích chuột không hiển thị như được nhấp vào một liên kết url thật, nhưng bạn có thể khắc phục nó như vậy:

final CharSequence text = tv.getText(); 
    final SpannableString notClickedString = new SpannableString(text); 
    notClickedString.setSpan(new URLSpan(""), 0, notClickedString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    tv.setText(notClickedString, TextView.BufferType.SPANNABLE); 
    final SpannableString clickedString = new SpannableString(notClickedString); 
    clickedString.setSpan(new BackgroundColorSpan(Color.GRAY), 0, notClickedString.length(), 
      Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 
    tv.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(final View v, final MotionEvent event) { 
      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       tv.setText(clickedString); 
       break; 
      case MotionEvent.ACTION_UP: 
       tv.setText(notClickedString, TextView.BufferType.SPANNABLE); 
       v.performClick(); 
       break; 
      case MotionEvent.ACTION_CANCEL: 
       tv.setText(notClickedString, TextView.BufferType.SPANNABLE); 
       break; 
      } 
      return true; 
     } 
    }); 

Một giải pháp khác là sử dụng Html.fromHtml (...), trong đó văn bản bên trong có các thẻ liên kết ("").

Nếu bạn muốn có giải pháp khác, hãy kiểm tra this post.

0

Có câu trả lời hay hơn.Đây là những gì tôi đã làm.

 final SpannableString ss = new SpannableString("Click here to verify Benificiary"); 
     ClickableSpan clickableSpan = new ClickableSpan() { 
      @Override 
      public void onClick(View textView) { 

      } 
      @Override 
      public void updateDrawState(TextPaint ds) { 
       super.updateDrawState(ds); 
       ds.setUnderlineText(false); 
      } 
     }; 
     ss.setSpan(clickableSpan,0,ss.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
textView.setMovementMethod(LinkMovementMethod.getInstance()); 
     textView.setHighlightColor(Color.BLUE); 

Bạn đi bất cứ nơi nào bạn thích khi người dùng nhấp chuột vào liên kết thông qua phương pháp onclick của ClickableSpan

Các vấn đề liên quan