2014-05-01 13 views
5

Mam TextView, którego szukam, aby umożliwić użytkownikowi wyszukiwanie dla określonego ciągu. Jeśli łańcuch zostanie znaleziony, powinien podświetlić. Używanie rozpiętości tła jest zbyt wolne i niezręczne, więc próbuję ustalić, czy mogę po prostu wybrać ciąg znaków. Wiem, że z EditText byłoby to możliwe przy użyciu setSelection(), ale nie chcę, aby użytkownik mógł edytować tekst, ale wciąż może ręcznie podświetlać tekst, co nie może sprawiać problemu z EditText.Czy istnieje sposób programowego zaznaczania tekstu w widoku TextView?

Zgaduję, to jest albo albo; czy to jest możliwe, aby programowo wybrać tekst w postaci TextViewlub, aby umożliwić wybór tekstu bez możliwości edycji w postaci EditText?

Uwaga: Używam niestandardowego widoku rozszerzającego TextView, więc zakładam, że jest to albo rozszerzenie EditText; Po prostu nie jestem pewien, który (jeśli którykolwiek) będzie działał.

+0

możliwe byłoby zmienić kolor części napisu TextView. Po prostu użyj kodu HTML wokół części, aby oznaczyć i użyć HTML.fromHTML w swoim tekście setText. Lub możesz użyć obiektu Spannable. –

+0

Tak, tak właśnie zrobiłem, ale jest powolny, ponieważ tekst jest duży. – yuttadhammo

+1

"Korzystanie z rozpiętości tła jest zbyt wolne i niezręczne" - ummmm ... naprawdę? Nie widziałem z tym problemu. Za pomocą [tego przykładowego projektu] (https://github.com/commonsguy/cw-omnibus/tree/master/RichText/Search) mogę wyszukiwać wystąpienia podciągu w dłuższym ciągu, usuwając wszystkie istniejące 'BackgroundColorSpans' i zastosowanie nowego 'BackgroundColorSpans', w 20-30ms, w ~ 20 liniach kodu. "tekst jest duży" - jak duży? – CommonsWare

Odpowiedz

0

Nie jestem pewien, czy pytanie jest nadal aktualne, dostarczę moje rozwiązanie. Może będzie przydatny dla osób pochodzących z wyszukiwarek.

Tak więc, jak zrozumiałem, celem jest zaznaczenie całego tekstu w TextView bez możliwości modyfikacji jego zawartości. Nie sprawdzałem, jak skutecznie działa na bardzo duży tekst, ale mam nadzieję, że nie tak źle.

Uwaga, wersja API powinny być> = 11

import android.annotation.TargetApi; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Build; 
import android.text.Selection; 
import android.text.Spannable; 
import android.util.AttributeSet; 

public class SelectableTextView extends TextView 
{ 
    public SelectableTextView(Context context) 
    { 
     super(context); 
     init(); 
    } 

    public SelectableTextView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     init(); 
    } 

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

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public SelectableTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) 
    { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     init(); 
    } 

    private void init() 
    { 
     if (Build.VERSION.SDK_INT > 10) 
      setTextIsSelectable(true); 
    } 

    @Override 
    public boolean onTextContextMenuItem(int id) 
    { 
     switch (id) 
     { 
      case android.R.id.cut: 
       return true; 

      case android.R.id.paste: 
       return true; 

      case android.R.id.shareText: 
      { 
       String selectedText = getText().toString().substring(getSelectionStart(), getSelectionEnd()); 

       if (selectedText != null && !selectedText.isEmpty()) 
       { 
        Intent sendIntent = new Intent(); 
        sendIntent.setAction(Intent.ACTION_SEND); 
        sendIntent.putExtra(Intent.EXTRA_TEXT, selectedText); 
        sendIntent.setType("text/plain"); 
        sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        getContext().startActivity(sendIntent); 
       } 

       return true; 
      } 

      case android.R.id.selectAll: 
      { 
       selectAllText(); 
       return true; 
      } 
     } 

     return super.onTextContextMenuItem(id); 
    } 

    public void selectAllText() 
    { 
     if (Build.VERSION.SDK_INT > 10) 
      Selection.setSelection((Spannable) getText(), 0, length()); 
    } 

}

Powiązane problemy