The problem is to handle my own action on click on URL span. I wrote custom URLSpan but it doesn't work.

This is my custom URLSpan:

public class CustomURLSpan extends android.text.style.URLSpan {

private Command mClickAction;

public CustomURLSpan(String url, Command clickAction) {

super(url);

mClickAction = clickAction;

}

@Override

public void onClick(View widget) {

try {

mClickAction.execute();

} catch (Exception e) {

}

}

public static void clickifyTextView(TextView tv, Command clickAction) {

SpannableString current = new SpannableString(tv.getText());

URLSpan[] spans =

current.getSpans(0, current.length(), URLSpan.class);

for (URLSpan span : spans) {

int start = current.getSpanStart(span);

int end = current.getSpanEnd(span);

current.removeSpan(span);

current.setSpan(new CustomURLSpan(span.getURL(), clickAction), start, end, 0);

}

}

public interface Command {

void execute();

}

}

And here I use it:

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

Bundle bundle = getArguments();

String message = bundle.getString("message");

final Activity activity = getActivity();

text = new TextView(activity);

text.setText(message);

Linkify.addLinks(text, Linkify.EMAIL_ADDRESSES);

CustomURLSpan.clickifyTextView(text, new CustomURLSpan.Command() {

@Override

public void execute() {

//I want to do my stuff here, but not working

}

});

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());

alertDialogBuilder.setView(text);

alertDialogBuilder.setNegativeButton("Close", new DialogInterface.OnClickListener() {

...

}

But if I click on url, I get the native android dialog to choose email programm. All examples I find in internet are same.

EDIT: According to answer from @CommonWare. I just needed:

...

public static void clickifyTextView(TextView tv, Command clickAction) {

SpannableString current = new SpannableString(tv.getText());

URLSpan[] spans =

current.getSpans(0, current.length(), URLSpan.class);

for (URLSpan span : spans) {

int start = current.getSpanStart(span);

int end = current.getSpanEnd(span);

current.removeSpan(span);

current.setSpan(new CustomURLSpan(span.getURL(), clickAction), start, end, 0);

tv.setText(current); //this is what I need

}

}

public interface Command {

void execute();

}

解决方案

clickifyTextView() retrieves the text from the TextView, wraps it in a new SpannableString... then never updates the TextView. So clickifyTextView() is modifying a copy of what is in the TextView, which therefore does not affect the TextView.

Try calling setText() on the TextView after your span conversion loop in clickifyTextView().

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐