Интерактивное слово внутри TextView в android
У меня есть TextView с измененным текстом. Этот текст содержит строки типа <a href='myWord'>myWord</a>
. Я хочу, чтобы после нажатия этой "ссылки" myWord появился в EditText в том же действии.
Это мой код:
txt.setText(Html.fromHtml("...<a href='link'>link</a>..."));
txt.setMovementMethod(LinkMovementMethod.getInstance());
Он хорошо работает для URL-адресов внутри атрибута href, но есть ошибка для другого формата.
Я нашел много похожих вопросов в StackOverflow, но все они касались ссылок на URL. В моем приложении я хочу создать "ссылку" внутри действия.
В общем, я могу изменить тег на другой, если он зависит...
Пожалуйста, помогите мне!
Спасибо!
----- ----- РЕШИТЬ
Спасибо, Джейкоб Филлипс за идею!
Может быть, это будет интересно кому-то в будущем.
Это код:
//This is my string;
String str = "<b>Text</b> which contains one <a href='#'>link</a> and another <a href='#'>link</a>";
//TextView;
TextView txt = new TextView(this);
//Split string to parts:
String[] devFull = data[v.getId()][1].split("<a href='#'>");
//Adding first part:
txt.append(Html.fromHtml(devFull[0]));
//Creating array for parts with links (they amount always will devFull.length-1):
SpannableString[] link = new SpannableString[devFull.length-1];
//local vars:
ClickableSpan[] cs = new ClickableSpan[devFull.length-1];
String linkWord;
String[] devDevFull = new String[2];
for(int i=1; i<devFull.length; i++){
//obtaining 'clear' link
devDevFull = devFull[i].split("</a>");
link[i-1] = new SpannableString(devDevFull[0]);
linkWord = devDevFull[0];
cs[i-1] = new ClickableSpan(){
private String w = linkWord;
@Override
public void onClick(View widget) {
// here you can use w (linkWord)
}
};
link[i-1].setSpan(cs[i-1], 0, linkWord.length(), 0);
txt.append(link[i-1]);
try{
txt.append(Html.fromHtml(devDevFull[1]));
}
catch(Exception e){}
}
Ответы
Ответ 1
Это должно сделать трюк. Просто измените текст edittext в OnClickListener
. Он может быть уменьшен, но это должно сработать.
private void foo() {
SpannableString link = makeLinkSpan("click here", new View.OnClickListener() {
@Override
public void onClick(View v) {
// respond to click
}
});
// We need a TextView instance.
TextView tv = new TextView(context);
// Set the TextView text
tv.setText("To perform action, ");
// Append the link we created above using a function defined below.
tv.append(link);
// Append a period (this will not be a link).
tv.append(".");
// This line makes the link clickable!
makeLinksFocusable(tv);
}
/*
* Methods used above.
*/
private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener) {
SpannableString link = new SpannableString(text);
link.setSpan(new ClickableString(listener), 0, text.length(),
SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
return link;
}
private void makeLinksFocusable(TextView tv) {
MovementMethod m = tv.getMovementMethod();
if ((m == null) || !(m instanceof LinkMovementMethod)) {
if (tv.getLinksClickable()) {
tv.setMovementMethod(LinkMovementMethod.getInstance());
}
}
}
/*
* ClickableString class
*/
private static class ClickableString extends ClickableSpan {
private View.OnClickListener mListener;
public ClickableString(View.OnClickListener listener) {
mListener = listener;
}
@Override
public void onClick(View v) {
mListener.onClick(v);
}
}
Ответ 2
Лучший подход -
SpannableString ss = new SpannableString("Android is a Software stack");
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
startActivity(new Intent(MyActivity.this, NextActivity.class));
}
};
ss.setSpan(clickableSpan, 22, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//where 22 and 27 are the starting and ending index of the String. Now word stack is clickable
// onClicking stack it will open NextActiivty
TextView textView = (TextView) findViewById(R.id.hello);
textView.setText(ss);
textView.setMovementMethod(LinkMovementMethod.getInstance());
Ответ 3
Лучшим обходным решением, которое я знаю, является создание собственного класса Button. Вы можете сделать Button прозрачным фоном, чтобы пользователь мог видеть только текст. Затем, когда кнопка нажата, измените TextColor и TextStyle кнопки на более темный цвет и подчеркнуте. Это будет работать точно так же, как это делает ссылка. Затем вы можете использовать startActivity для перехода к присвоенной деятельности. Вы не должны использовать гиперссылки для подключения к другим действиям в вашем приложении.
Ответ 4
Мое личное мнение состояло бы в том, чтобы сделать второй текст, содержащий текст, который вы хотите быть вашей ссылкой. Затем вы можете сделать свое действие в onClick этого второго textView. Также, как указано выше, zzzzzzzzzzz, вы можете изменить свойства шрифта этого текста на все, что захотите, после его нажатия.
Ответ 5
Чтобы получить полный ответ с ответами на смешивание,
private void textAreaInit()
{
String str = "<a href='#'>Link 1</a> and <a href='#'>Link2</a> is here.";
TextView tv = mConfirmText;
String[] devFull = str.split("<a href='#'>");
tv.append(Html.fromHtml(devFull[0]));
SpannableString[] link = new SpannableString[devFull.length-1];
ClickableSpan[] cs = new ClickableSpan[devFull.length-1];
String linkWord;
String[] devDevFull = new String[2];
for(int i=1; i<devFull.length; i++)
{
//obtaining 'clear' link
devDevFull = devFull[i].split("</a>");
link[i-1] = new SpannableString(devDevFull[0]);
linkWord = devDevFull[0];
final String a = linkWord;
cs[i-1] = new ClickableSpan()
{
private String w = a;
@Override
public void onClick(View widget) {
if(w.equals("Link 1"))
{
Intent intent = new Intent(PrintPropertiesActivity.this, ViewerAcivity.class);
intent.putExtra("title", "Link1");
intent.putExtra("uri", "link1");
intent.putExtra("type", "1");
startActivity(intent);
}
else
{
Intent intent = new Intent(PrintPropertiesActivity.this, ViewerAcivity.class);
intent.putExtra("title", "Link2");
intent.putExtra("uri", "link2");
intent.putExtra("type", "2");
startActivity(intent);
}
}
};
link[i-1].setSpan(cs[i-1], 0, linkWord.length(), 0);
tv.append(link[i-1]);
try{
tv.append(Html.fromHtml(devDevFull[1]));
}
catch(Exception e){}
}
makeLinksFocusable(tv);
}
private void makeLinksFocusable(TextView tv) {
MovementMethod m = tv.getMovementMethod();
if ((m == null) || !(m instanceof LinkMovementMethod)) {
if (tv.getLinksClickable()) {
tv.setMovementMethod(LinkMovementMethod.getInstance());
}
}
}