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());
}
}
fonte
2017-08-01 09:33:14
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. –
Sì, questo è quello che ho fatto in origine, ma è lento perché il testo è grande. – yuttadhammo
"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