如何使用ClickableSpan,但忽略来自TextView的点击

时间:2016-05-04 16:21:18

标签: android

以下代码显示了我如何使用自定义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代码

5 个答案:

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

现在跨度应用: enter image description here

这是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. 点击/点按“跨越”文字外无效
  2. 点击/点按“跨越”部分文字将显示Snackbar
  3. enter image description here

    就是这样。如果您需要任何其他信息,请与我们联系。

答案 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" />

You can use tutorial here

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

希望这会对你有所帮助。