以下代码显示了我如何使用自定义ClickableSpan和选择器应用按下状态。但是,每当我按下TextView上的任何位置时,都会应用按下状态,而不仅仅是ClickableSpan。我该如何阻止它?
注意:它不会调用 onClick
,但会从选择器中应用 state_pressed
。我希望它既不会这样做。
MyView.java
SpannableString spanned = new SpannableString("click here");
spannable.setSpan(new MyClickableSpan() {
@Override
public void onClick(View widget) {
doSomething();
}
}, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spanned);
textView.setMovementMethod(LinkMovementMethod.getInstance());
MyClickableSpan.java
public abstract class MyClickableSpan extends ClickableSpan {
@Override
public abstract void onClick(View view);
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
TextView
<TextView
android:id="@+id/my_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:textColorLink="@color/my_selector" />
my_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/my_color_pressed" />
<item android:color="@color/my_color" />
</selector>
编辑注释:添加了TextView代码
答案 0 :(得分:1)
下一个示例按预期工作:
Spannable span = SpannableStringBuilder.valueOf("Hello clickable span!");
span.setSpan(new MyClickableSpan(), 6, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView.setText(span);
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
这是MyClickableSpan(),它只显示Snackbar以表示处理“click”:
class MyClickableSpan extends ClickableSpan {
@Override
public void onClick(View widget) {
Snackbar.make(getWindow().findViewById(android.R.id.content), "Click on span!", Snackbar.LENGTH_LONG).show();
}
}
我们有:
答案 1 :(得分:1)
您可以参考下面我测试过的代码。
String s = "This is custom string click Here";
SpannableString spanned = new SpannableString(s);
spanned.setSpan(new MyClickableSpan() {
@Override
public void onClick(View widget) {
Log.i("main", "Link clicked");
}
}, s.length() - 10, s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spanned);
textView.setMovementMethod(LinkMovementMethod.getInstance());
的TextView
<TextView
android:id="@+id/my_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@drawable/my_selector"
android:textColorLink="@color/colorPrimary" />
答案 2 :(得分:0)
您必须将MovementMethod设置为具有Span的TextView。
public function update(ClientRequest $request, Client $client)
{
$client->update($request->all());
$request->session()->flash('success', 'Client has been updated.');
return \Ajax::redirect(route('clients.index'));
}
答案 3 :(得分:0)
在您的代码中,您已定义
android:textColor="@android:color/white"
而不是这个你必须定义你的选择器,如下面
android:textColor="@drawable/my_selector"
代码的其余部分是因为您只需要更改我在上面解释的android:textColor="@drawable/my_selector"
一行。
答案 4 :(得分:-1)
你可以这样做:
TextView textView = (TextView)findViewById(R.id.textView);
Spannable span = Spannable.Factory.getInstance().newSpannable("test link span");
span.setSpan(new ClickableSpan() {
@Override
public void onClick(View v) {
Log.i("main", "Link clicked");
Toast.makeText(HomeScreenActivity.this, "link clicked", Toast.LENGTH_SHORT).show();
} }, 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// set the "test " spannable.
span.setSpan(cs, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// set the " span" spannable
span.setSpan(cs, 6, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(span);
textView.setMovementMethod(LinkMovementMethod.getInstance());
希望这会对你有所帮助。