2014-05-01 12 views
5

Ich habe eine TextView, die ich suche, um dem Benutzer zu ermöglichen, nach einer bestimmten Zeichenfolge zu suchen. Wenn die Zeichenfolge gefunden wird, sollte sie hervorgehoben werden. Die Verwendung einer Hintergrundspanne ist zu langsam und unpraktisch, also versuche ich herauszufinden, ob ich die Saite auswählen kann. Ich weiß, mit EditText wäre dies möglich mit setSelection(), aber ich möchte nicht der Benutzer in der Lage sein, den Text zu bearbeiten, während immer noch in der Lage, Text manuell hervorzuheben, die ich nicht mit einer EditText verwalten kann.Gibt es eine Möglichkeit, Text in einem TextView programmatisch auszuwählen?

Ich denke, dann ist es entweder oder; ist es entweder möglich, programmatisch Text in einem TextViewoder möglichen Textauswahl auswählen, ohne Bearbeitung in einem EditText?

Hinweis: Ich benutze tatsächlich eine benutzerdefinierte Ansicht erweitert TextView, so nehme ich an, dass es entweder das ist oder erweitern EditText; Ich bin mir einfach nicht sicher, welches (wenn) auch funktionieren wird.

+0

Es wäre möglich, die Farbe eines Teils des Textview-String. Verwenden Sie einfach HTML um das Teil, um HTML.fromHTML in Ihrem setText zu markieren und zu verwenden. Oder Sie könnten ein spannbares Objekt verwenden. –

+0

Ja, das habe ich ursprünglich gemacht, aber es ist langsam, weil der Text groß ist. – yuttadhammo

+1

"Eine Hintergrundspanne ist zu langsam und umständlich" - ummmmm ... wirklich? Ich habe damit kein Problem gesehen. Mit [diesem Beispielprojekt] (https://github.com/commonsguy/cw-omnibus/tree/master/RichText/Search) kann ich nach Vorkommen eines Teilstrings in einem längeren String suchen, wobei alle vorhandenen "BackgroundColorSpans" und Anwendung neuer 'BackgroundColorSpans' in 20-30ms in ~ 20 Zeilen Code. "Der Text ist groß" - wie groß? – CommonsWare

Antwort

0

Nicht sicher, ob die Frage noch aktuell ist, werde ich meine Lösung zur Verfügung stellen. Vielleicht wird es für Leute nützlich sein, die von Suchmaschinen kommen.

Also der Zweck, wie ich verstanden habe, ist, den gesamten Text in TextView auszuwählen, ohne in der Lage zu sein, seinen Inhalt zu ändern. Ich habe nicht überprüft, wie effektiv es gegen sehr großen Text ist, aber hoffe, dass es nicht so schlimm ist.

Bitte beachten Sie, sollte API-Version sein> = 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()); 
    } 

}

Verwandte Themen