2014-02-17 3 views
2

Есть активность, которую я хочу установить autoLink атрибут TextView. Также я хочу узнать USSD коды как * 140 * 7 # и действовать, когда коснулся его, например, номер телефона, URL-адрес веб-сайта, адрес электронной почты.Признать код USSD в текстовом виде на Android

[Уведомление] В общем, я хотел бы использовать настраиваемый текст TextView, который также может распознавать коды USSD.

enter image description here

Я прибегая к помощи, но я не мог найти подходящее решение.

+0

Может быть, вы можете создать Regex для кода USSD и сравнить его с текстом из ' TextView' –

+0

Когда я могу сопоставить код USSD в textview, что мне делать? Я хочу показать его как номер телефона с синим цветом. –

+1

вы можете проверить перед использованием метода 'setText()' и установить PaintFlags, чтобы подчеркнуть и сделать цвет синим .. ИЛИ вы можете расширить 'TextView' и переопределить' onDraw() 'метод и проверить там –

ответ

1

Наконец-то я могу найти решение по моей просьбе. Как @basant_matharu упоминались в комментариях, я насколько TextView элемент, который вы можете увидеть, что ниже кода:

public class LinkEnabledTextView extends TextView { 


    // Pattern for gathering *140*1# from the Text 
    Pattern ussdPattern = Pattern.compile("(\\*[0-9]+[\\*[0-9]+]*#)"); 
    private TextLinkClickListener mListener; 
    private ArrayList<Hyperlink> listOfLinks; 

    public LinkEnabledTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     listOfLinks = new ArrayList<Hyperlink>(); 

    } 

    public void setText(String text) { 
     SpannableString linkableText = new SpannableString(text); 

     gatherLinks(listOfLinks, linkableText, ussdPattern); 

     for (Hyperlink linkSpec : listOfLinks) { 
      // this process here makes the Clickable Links from the text 
      linkableText.setSpan(linkSpec.span, linkSpec.start, linkSpec.end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     } 
     // sets the text for the TextView with enabled links 
     super.setText(linkableText); 
    } 

    public void setOnTextLinkClickListener(TextLinkClickListener newListener) { 
     mListener = newListener; 
    } 

    private void gatherLinks(ArrayList<Hyperlink> links, Spannable s, Pattern pattern) { 
     Matcher m = pattern.matcher(s); 

     while (m.find()) { 
      int start = m.start(); 
      int end = m.end(); 

      Hyperlink spec = new Hyperlink(); 
      spec.textSpan = s.subSequence(start, end); 
      spec.span = new InternalURLSpan(spec.textSpan.toString()); 
      spec.start = start; 
      spec.end = end; 

      links.add(spec); 
     } 
    } 

    public interface TextLinkClickListener { 
     public void onTextLinkClick(View textView, String clickedString); 
    } 

    /** 
    * Class for storing the information about the Link Location 
    */ 
    public class InternalURLSpan extends ClickableSpan { 
     private String clickedSpan; 

     public InternalURLSpan(String clickedString) { 
      clickedSpan = clickedString; 
     } 

     @Override 
     public void onClick(View textView) { 
      mListener.onTextLinkClick(textView, clickedSpan); 
     } 
    } 

    class Hyperlink { 
     CharSequence textSpan; 
     InternalURLSpan span; 
     int start; 
     int end; 
    } 
} 

В этом классе переопределенного SetText() метод для распознавать любые модели, как USSD кодов. Также Существует интерфейс с именем TextLinkClickListener, которые помогают нам позвонить признает USSD код:

public interface TextLinkClickListener { 
    public void onTextLinkClick(View textView, String clickedString); 
} 

Использовать пользовательский класс вместо TextView:

<com.example.test.custom_textview.LinkEnabledTextView 
     android:id="@+id/txtMessage" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="18sp" 
     android:textColor="@android:color/black" 
     android:autoLink="all"/> 

И в вашей деятельности (например):

LinkEnabledTextView textView = (LinkEnabledTextView) findViewById(R.id.txtMessage); 
textView.setOnTextLinkClickListener(this); 
textView.setText(text); 

Всюду, где вы хотите позвонить в USSD-код, вы должны написать ниже код и вызвать LinkEnabledTextView слушатель:

public void onTextLinkClick(View textView, String clickedString) { 
    String ussdCode = clickedString.substring(0, clickedString.indexOf("#")) + Uri.encode("#"); 
    startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + ussdCode))); 
} 

О, знать permissiion вызов записи в файле манифеста:

<uses-permission android:name="android.permission.CALL_PHONE" /> 
Смежные вопросы