2015-06-08 1 views
0

У меня есть текстовое представление и ссылки в нем. Я хочу, чтобы ссылки были выделены, когда я прикасаюсь к ним, а также я хочу открыть Alertdialog, когда я долго их прокручиваю. Я пытался достичь решения путем настройки URLSpan, но, так как я не могу получить доступ к MView до того OnClick называется, я не могу установить слушателей:Добавление OnTouch и OnClickListener в ссылки в TextView и изменение цвета фона ссылки

class ConfirmSpan extends URLSpan{ 
    View mView; 
    URLSpan span; 

    public ConfirmSpan(URLSpan span) { 
     super(span.getURL()); 
     this.span = span; 

     //there is a nullpointerexception here since mView is null now. 
     mView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       ((TextView)v).setBackgroundColor(0xcccccccc); 
       return false; 
      } 
     }); 

     //this is also an exception 
     mView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 

       Log.d("INFO","long click yay!"); 
       return false; 
      } 
     }); 
    } 

    //this should be called to reach the view. But then I can't handle touch state. 
    @Override 
    public void onClick(View widget) { 
     mView = widget; 

     //bla bla.. 
    } 

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

} 

Я думаю, что я должен настроить класс LinkMovementMethod, но как? Любые комментарии будут оценены. UPDATE: я теперь в состоянии справиться с сенсорным событие с этим кодом:

public class CustomLinkMovementMethod extends LinkMovementMethod { 
private static CustomLinkMovementMethod sInstance; 

@Override 
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { 
    // Here I am changing backgorund color 
    if(event.getAction() == MotionEvent.ACTION_DOWN) 
     widget.setBackgroundColor(0xcccccccc); 
    if(event.getAction() == MotionEvent.ACTION_UP) 
     widget.setBackgroundColor(0xffffffff); 
    return super.onTouchEvent(widget, buffer, event); 
} 
public static MovementMethod getInstance() { 
    if (sInstance == null) 
     sInstance = new CustomLinkMovementMethod(); 

    return sInstance; 
} 

}

Но TextView имени виджета, параметр OnTouchEvent(), это не то, что я хочу. Это весь текст. Поэтому, когда я касаюсь ссылки, текст становится серым вообще. Я думаю, мне нужны другие методы, такие как окрашивание фона ссылки путем нахождения координат начальной и конечной линий ссылки.

ответ

3

Благодарим за вопрос, я думаю, у меня может быть решение для вас.

Заканчивать код в https://gist.github.com/qtyq/90f9b4894069a8b3676c

Это завод вспомогательный класс для SpannableString, который позволяет легко создавать SpannableString по:

  1. передавая оригинальную строку в статической инициализации (String s) метод
  2. , вызывающий метод makeLink (...), чтобы сделать нужную подстроку в ссылке
  3. необязательно вызывать другие методы, такие как makeBold (...) (который уже вызывается в makeLink) или setCo lor (...), чтобы настроить внешний вид
  4. 44 и, наконец, вызвать create() для создания объекта SpannableString, который вы можете применить только к вашему текстуру с помощью setText (...).

Вот пример его использования:

SpannableString ss = SpannableBuilder.init(bottomText) 
     .setColor("Terms & Conditions", getResources().getColor(R.color.orange)) 
     .makeLink(getContext(), "Terms & Conditions", terms) 
     .setColor("Privacy Policy", getResources().getColor(R.color.orange)) 
     .makeLink(getContext(), "Privacy Policy", policy) 
     .create(); 
textView1.setText(ss); 

И, конечно, вы можете настроить методы уже в этом классе или добавить свои собственные, если вам нужна дополнительная настройка, просто чтение документации компании Google для SpannableString для получения дополнительной информации о том, что вы можете сделать.

 Смежные вопросы

  • Нет связанных вопросов^_^