当使用SpannableString设置TextView部分可点击时,很难长时间点击TextView



我使用SpannableString设置了textView的一部分是可点击的。但是我很难检测到长按我的textView。

private fun makeTextLink(textView: TextView, str: String, underlined: Boolean, color: Int?, action: (() -> Unit)? = null) {
val spannableString = SpannableString(textView.text)
val textColor = color ?: textView.currentTextColor
val clickableSpan = object : ClickableSpan() {
override fun onClick(textView: View) {
action?.invoke()
}
override fun updateDrawState(drawState: TextPaint) {
super.updateDrawState(drawState)
drawState.isUnderlineText = underlined
drawState.color = textColor
}
}
val index = spannableString.indexOf(str)
spannableString.setSpan(clickableSpan, index, index + str.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
textView.text = spannableString
textView.movementMethod = LinkMovementMethod.getInstance()
textView.highlightColor = Color.TRANSPARENT
}
TextView textView = findViewById(R.id.text_view);
String text = "First Click THIS and then THIS ";

SpannableString ss = new SpannableString(text);

// creating clickable span to be implemented as a link
ClickableSpan clickableSpan1 = new ClickableSpan() {
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "First Clickable Text", Toast.LENGTH_SHORT).show();
}
};

// creating clickable span to be implemented as a link


// setting the part of string to be act as a link
ss.setSpan(clickableSpan1, 12, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);


textView.setText(ss);
textView.setMovementMethod(LinkMovementMethod.getInstance());
private void setClickableSpan(Activity context, TextView textView, String mainString, String selectedString)
{
ModelSettingData settingData = new StorageUtil(context).getSettingData();
ClickableSpan termsAndConditionSpan = new ClickableSpan()
{
@Override
public void onClick(@NonNull View textView) {
// code hear
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP){
// Do something for lollipop and above versions
ds.setUnderlineText(false);
ds.setColor(getResources().getColor(R.color.TRANSPARENT));
}
}
};


SpannableString content = new SpannableString(mainString);
int startPosition = mainString.indexOf(selectedString);
int endPosition = mainString.lastIndexOf(selectedString) + selectedString.length();
content.setSpan(termsAndConditionSpan, startPositionS1, endPositionS1, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
textView.setText(content);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(Color.TRANSPARENT);
}

你不解释什么"很困难长按TextView"的真正含义。我假设您想为TextView设置一个长单击侦听器。您可以在makeText函数中这样做:

textView.setOnLongClickListener { v ->
// your long click code goes here
true
}

返回true通常意味着长点击监听器已经消耗了触摸事件,不需要进一步处理。不幸的是,这个返回值似乎被一个可点击的跨度忽略了。如果您希望点击代码运行在长点击时,长点击是在可点击的跨度检测到,那么这不是一个问题;否则,您将需要找到一种方法来抑制长单击

的单击处理。这段代码也会使整个TextView长可点击,这也可能不是你想要的。

最新更新