Интерактивное слово внутри 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){} } 

Это должно сделать трюк. Просто измените текст OnClickListener в 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's 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); } } 

Лучший подход

  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()); 

Лучшим обходным решением, которое я знаю, является создание собственного класса Button. Вы можете сделать Button прозрачным фоном, чтобы пользователь мог видеть только текст. Затем, когда кнопка нажата, измените TextColor и TextStyle кнопки на более темный цвет и подчеркнуте. Это будет работать точно так же, как это делает ссылка. Затем вы можете использовать startActivity для перехода к присвоенной деятельности. Вы не должны использовать гиперссылки для подключения к другим видам деятельности в своем приложении.

Мое личное мнение состояло бы в том, чтобы сделать второй текст, содержащий текст, который вы хотите быть вашей ссылкой. Затем вы можете сделать свое действие в onClick этого второго textView. Также, как указано выше, zzzzzzzzzzz, вы можете изменить свойства шрифта этого текста на все, что захотите, после его нажатия.

Чтобы получить полный ответ с помощью смешивания ответов;

 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()); } } }