【问题标题】:How to use ClickableSpan, but ignore clicks from the TextView如何使用 ClickableSpan,但忽略来自 TextView 的点击
【发布时间】:2016-05-04 16:21:18
【问题描述】:

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

【问题讨论】:

  • 显示将 ClickableSpan 设置为 TextView 的代码
  • 你试过我的解决方案了吗?
  • @Fifer Sheep,你可能正在寻找这个解决方案。 stackoverflow.com/questions/20856105/…
  • 检查this。这可能会解决您的问题。

标签: android


【解决方案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 以指示处理“点击”:

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

就是这样。如果您需要任何其他信息,请告诉我。

【讨论】:

    【解决方案2】:

    您必须将 MovementMethod 设置为具有 Span 的 TextView。

    textView.setMovementMethod(LinkMovementMethod.getInstance());
    

    【讨论】:

    • 嗨,对不起,我应该添加我已经拥有的 TextView 代码,因为我已经设置了移动方法。我现在已经添加了这段代码。
    【解决方案3】:

    你可以参考下面我测试过的代码。

     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
        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

    【讨论】:

      【解决方案4】:

      你可以这样做:

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

      希望这会对你有所帮助。

      【讨论】:

      • span.setSpan(cs, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);这一行,cs是什么?
      • @Fifer Sheep,是字符串。表示您要设置跨度的字符串。
      • 不幸的是,这不起作用。当我点击 TextView 的其他部分时,我仍然在链接上看到按下状态。
      【解决方案5】:

      在你的代码中你已经定义了

       android:textColor="@android:color/white" 
      

      你必须像下面这样定义你的选择器

       android:textColor="@drawable/my_selector"
      

      其余代码不变,您只需更改我在上面解释的android:textColor="@drawable/my_selector" 的一行。

      【讨论】:

      • textColor 属性被textColorLink 属性覆盖 - 所以这对我没有帮助。非链接文本颜色很好。
      猜你喜欢
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 2012-06-23
      • 2013-03-26
      • 2013-03-12
      • 2011-06-15
      • 2012-08-07
      • 2016-12-11
      相关资源
      最近更新 更多