2014-05-01 10 views
5

Ho un TextView che sto cercando di consentire all'utente di cercare una stringa specifica. Se la stringa viene trovata, dovrebbe evidenziare. Usare uno sfondo è troppo lento e imbarazzante, quindi sto cercando di capire se posso semplicemente selezionarlo. So che con EditText ciò sarebbe possibile utilizzando setSelection(), ma non voglio che l'utente sia in grado di modificare il testo, pur essendo ancora in grado di evidenziare manualmente il testo, che non riesco a gestire con un EditText.C'è un modo per selezionare in modo programmatico il testo in un TextView?

Suppongo, quindi è un uno o; è o possibile selezionare il testo in un TextViewo possibile per consentire la selezione del testo senza consentire la modifica in un EditText?

Nota: attualmente sto utilizzando una vista personalizzata che estende TextView, quindi presumo che sia quella o estenda EditText; Non sono sicuro di quale (se mai) funzionerà.

+0

Sarebbe possibile cambiare il colore della parte della stringa TextView. Basta usare un po 'di HTML intorno alla parte per contrassegnare e utilizzare HTML.fromHTML nel setText. O potresti usare un oggetto Spannable. –

+0

Sì, questo è quello che ho fatto in origine, ma è lento perché il testo è grande. – yuttadhammo

+1

"L'uso di uno sfondo è troppo lento e impacciato" - ummmm ... davvero? Non ho visto un problema con questo. Con [questo progetto di esempio] (https://github.com/commonsguy/cw-omnibus/tree/master/RichText/Search), posso cercare le occorrenze di una sottostringa in una stringa più lunga, rimuovendo tutti i 'BackgroundColorSpans' esistenti e applicando il nuovo 'BackgroundColorSpans', in 20-30ms, in ~ 20 righe di codice. "il testo è grande": quanto è grande? – CommonsWare

risposta

0

Non so se la domanda è ancora attuale, fornirò la mia soluzione. Forse sarà utile per le persone provenienti dai motori di ricerca.

Quindi lo scopo, come ho capito, è quello di selezionare tutto il testo in TextView senza poter modificare il suo contenuto. Non ho verificato quanto sia efficace contro un testo molto grande, ma spero che non sia così grave.

Si prega di notare, la versione API dovrebbe essere> = 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()); 
    } 

}

Problemi correlati