studio - textview android
¿Cómo hacer clic o tocar un texto de TextView en diferentes palabras? (5)
Basado en la respuesta de Boy (y gracias por su respuesta que me ayudó mucho), esta es otra forma en que lo implementé sin los caracteres ''['' y '']'' usando una clase interna para describir palabras seleccionables:
import java.util.List;
import android.content.Context;
import android.text.SpannableStringBuilder;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* Defines a TextView widget where user can click on different words to see different actions
*
*/
public class ClickableTextView extends TextView {
public ClickableTextView(Context context) {
super(context);
}
public ClickableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ClickableTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setTextWithClickableWords(String text, List<ClickableWord> clickableWords) {
setMovementMethod(LinkMovementMethod.getInstance());
setText(addClickablePart(text, clickableWords), BufferType.SPANNABLE);
}
private SpannableStringBuilder addClickablePart(String str, List<ClickableWord> clickableWords) {
SpannableStringBuilder ssb = new SpannableStringBuilder(str);
for (ClickableWord clickableWord : clickableWords) {
int idx1 = str.indexOf(clickableWord.getWord());
int idx2 = 0;
while (idx1 != -1) {
idx2 = idx1 + clickableWord.getWord().length();
ssb.setSpan(clickableWord.getClickableSpan(), idx1, idx2, 0);
idx1 = str.indexOf(clickableWord.getWord(), idx2);
}
}
return ssb;
}
public static class ClickableWord {
private String word;
private ClickableSpan clickableSpan;
public ClickableWord(String word, ClickableSpan clickableSpan) {
this.word = word;
this.clickableSpan = clickableSpan;
}
/**
* @return the word
*/
public String getWord() {
return word;
}
/**
* @return the clickableSpan
*/
public ClickableSpan getClickableSpan() {
return clickableSpan;
}
}
}
Espero que esto pueda ayudar a alguien
EDITAR: cómo cambiar el color del enlace y eliminar el subrayado:
Crea y usa tu propia implementación de ClickableSpan de esta manera:
//a version of ClickableSpan without the underline
public static class NoUnderlineClickableSpan extends ClickableSpan {
private int color = -1;
public void setColor(int color) {
this.color = color;
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
if (this.color != -1) {
ds.setColor(this.color);
}
}
}
Cómo moverse a otra vista haciendo clic en la vista de texto con dos palabras diferentes. esta es la cadena que estoy usando
By clicking Sign Up, you are indicating that you have read and agree to the
Term of Use and Privacy Policy.
Quiero hacer estas dos palabras (Términos de uso, Política de privacidad) en un color diferente y hacer clic.
Sé cómo hacer color para una palabra en particular. Quiero hacer que se pueda hacer clic.
En la implementación de ClickableTextView, ¿qué sucede si la cadena tiene una palabra repetida? Supongamos que, por ejemplo, la cadena es "Me puedo hacer clic y también se puede hacer clic", entonces ambas cadenas deberían cambiarse a Cadena de Spannable, pero en ese escenario no se puede cambiar, solo una se cambiará a una cadena de Spannable.
Es mucho más sencillo usar HTML con enlaces en TextView que crear múltiples TextViews, cuidando el diseño, los oyentes, etc.
En su actividad o fragmento:
TextView mText = (TextView) findViewById(R.id.text_linkified);
mText.setText(Html.fromHtml("Open <a href=''myapp://my-activity''>My Activity</a> or" +
" <a href=''myapp://other-activity''>Other Activity</a>"));
mText.setMovementMethod(LinkMovementMethod.getInstance());
En manifiesto
<activity android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="myapp" android:host="my-activity"/>
</intent-filter>
</activity>
<activity android:name=".MyOtherActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="myapp" android:host="other-activity" />
</intent-filter>
</activity>
Finalmente, descubrí cómo tener varias partes en las que se puede hacer clic en un TextView. ¡Es importante que todos tengan su propio ClickableSpan! Ahí es donde me equivoqué la primera vez que lo probé. Si tienen la misma instancia de ClickableSpan, solo se recuerda el último intervalo establecido.
Creé una cadena con el área requerida para hacer clic rodeada por "[" y "]".
String sentence = "this is [part 1] and [here another] and [another one]";
y aquí está el conjunto TextView, el setMovementMehthod también es obligatorio:
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(addClickablePart(sentence), BufferType.SPANNABLE);
He creado esta función, la cual manejará la creación del área en la que se puede hacer clic:
private SpannableStringBuilder addClickablePart(String str) {
SpannableStringBuilder ssb = new SpannableStringBuilder(str);
int idx1 = str.indexOf("[");
int idx2 = 0;
while (idx1 != -1) {
idx2 = str.indexOf("]", idx1) + 1;
final String clickString = str.substring(idx1, idx2);
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(getView().getContext(), clickString,
Toast.LENGTH_SHORT).show();
}
}, idx1, idx2, 0);
idx1 = str.indexOf("[", idx2);
}
return ssb;
}
Recomiendo esta biblioteca: https://github.com/klinker24/Android-TextView-LinkBuilder
se ajusta a sus necesidades muy bien.
Una visión general rápida:
Léame del proyecto copiado:
- Especifique acciones de clic largo y corto de una palabra específica dentro de su TextView
- Proporcione comentarios de los usuarios resaltando el texto cuando lo toca. Coincidir con cadenas simples o use una expresión regular para establecer enlaces a cualquier texto que se ajuste a ese patrón.
- Cambiar el color del texto vinculado.
- Modificar la transparencia del texto resaltado cuando el usuario lo toca
- Establece si quieres o no el texto subrayado
La principal ventaja de usar esta biblioteca sobre la funcionalidad de enlace automático de TextView es que puede vincular cualquier cosa, no solo la dirección web, los correos electrónicos y los números de teléfono. También proporciona personalización de color y retroalimentación táctil.