バックグラウンド
textView 内でいくつかの URLSpan を使用したかったので、次のようなものを使用しました。
final Spanned spanned=Html.fromHtml(getString(R.string.test));
msgTextView.setText(spanned);
問題
機能しますが、アイテムをクリックするとクリックされたままになります。まだリンクに触れているようです...
私が試したこと
textView からフォーカスをクリアし、別のビューにフォーカスを設定しようとしましたが、どれも役に立ちませんでした。
また、クリックされるたびに UrlSpan を削除して代わりに新しいものを追加しようとしましたが、うまくいきませんでした。コードは次のとおりです。
public static Spannable setOnLinkClickedListener(final Spanned original,final IOnLinkClickListener listener)
{
final SpannableString result=new SpannableString(original);
final URLSpan[] spans=result.getSpans(0,result.length(),URLSpan.class);
for(final URLSpan span : spans)
{
final int start=result.getSpanStart(span);
final int end=result.getSpanEnd(span);
final int flags=result.getSpanFlags(span);
result.removeSpan(span);
final String url=span.getURL();
result.setSpan(new CustomURLSpan(url,start,result,end,listener,flags),start,end,flags);
}
return result;
}
private static final class CustomURLSpan extends URLSpan
{
private final int _start;
private final SpannableString _result;
private final String _url;
private final int _end;
private final IOnLinkClickListener _listener;
private final int _flags;
private CustomURLSpan(final String url,final int start,final SpannableString result,final int end,final IOnLinkClickListener listener,final int flags)
{
super(url);
_start=start;
_result=result;
_url=url;
_end=end;
_listener=listener;
_flags=flags;
}
@Override
public void onClick(final View widget)
{
if(_listener==null||!_listener.onClick(widget,_url))
super.onClick(widget);
_result.removeSpan(this);
_result.setSpan(new CustomURLSpan(_url,_start,_result,_end,_listener,_flags),_start,_end,_flags);
}
}
質問
クリックされるたびに URLSpan に残る選択/クリック効果をクリアするにはどうすればよいですか?