【问题标题】:How can I link some text of a TextView to an Activity?如何将 TextView 的某些文本链接到 Activity?
【发布时间】:2016-08-09 17:27:03
【问题描述】:

我想将TextView 上的一些文本链接到Activity。这是我拥有的 TextView:

<TextView
     android:id="@+id/termsLink"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:text="@string/terms"
     android:layout_weight="4"/>

@string/terms 在哪里:

<string name="terms">Accept <a href="#">terms & conditions.</a>.</string>

如果我有一个网页链接,我会这样做:

TextView link = (TextView) findViewById(R.id.termsLink);
link.setMovementMethod(LinkMovementMethod.getInstance());

但是当我按下链接时,我不知道如何启动一个活动,因为它是一个真正的链接(它链接一个网页)。

编辑:请注意,我不必在全文中处理onClick 事件,因为链接仅在"terms &amp; conditions" 部分上。

编辑 2:我尝试使用 cmets 上建议的两个 TextView 和以下答案之一来产生相同的效果。但有时(取决于屏幕)"terms &amp; conditions" 部分占用两行,因为它没有正确填充可用空间,因此第二行显示在第二个TextView 而不是第二行的开头。

效果类似这样:

Accept terms & 
       conditions.

我希望它是这样的:

Accept terms &
conditions.

提前致谢!

【问题讨论】:

  • @sushildlh 这可能无法解决,因为他只想点击“条款和条件”
  • 将您的文本分成 2 个不同的 textView 。这也容易得多。
  • int 清单,为您的目标Activity 添加intent-filter 标签,action 设置为android.intent.action.VIEWcategory 设置为android.intent.category.DEFAULTdata 设置schemetestscheme,现在你可以像这样使用它:&lt;string name="terms"&gt;Accept &lt;a href="testscheme://"&gt;terms.&lt;/a&gt;.&lt;/string&gt;
  • @pskink 好的,我快到了,但我错了,因为我认为dataintent-filter 的标签。非常感谢!我认为您应该将其添加为答案,因为它比现在的答案更简单。

标签: android


【解决方案1】:

创建一个带有内部 onClick 监听器的帮助类

public class ClickSpan extends ClickableSpan {

    private String url;
    private OnClickListener listener;

    public ClickSpan(String url, OnClickListener listener) {
        this.url = url;
        this.listener = listener;
    }

    @Override
    public void onClick(View widget) {
        if (listener != null) listener.onClick(url);
    }

    public interface OnClickListener {
        void onClick(String url);
    }
}

然后将现有跨度转换为可点击的跨度

public static Spannable createClickableSpans(Spanned original,     ClickSpan.OnClickListener listener) {
    SpannableString result = new SpannableString(original);
    URLSpan[] spans = result.getSpans(0, result.length(), URLSpan.class);

    for (URLSpan span : spans) {
        int start = result.getSpanStart(span);
        int end = result.getSpanEnd(span);
        int flags = result.getSpanFlags(span);

        result.removeSpan(span);
        result.setSpan(new ClickSpan(span.getURL(), listener), start, end, flags);
    }

    return result;
}

所以,最终的用法会是这样的

TextView link = (TextView) findViewById(R.id.termsLink);
link.setMovementMethod(LinkMovementMethod.getInstance());
link.setText(createClickableSpans((Spanned)link.getText(), new ClickSpan.OnClickListener(){
    @Override
    public void onClick(String url){
        //Handle click
    }
});

【讨论】:

  • 请在末尾添加缺少的结束符 )(括号)。
【解决方案2】:

仅让 TextView 的一部分可点击,您可以在 TextView 内使用 spannable 并设置 onClick 事件侦听器。从这里,您照常启动活动。您可以通过指定字符位置(从开始到结束)来限制文本的可点击部分

查看@becomputer06 的答案

How to set the part of the text view is clickable

【讨论】:

  • 如果他翻译他的资源可能不会起作用,因为“单词”在翻译文本中的位置会不同
  • 确实如此。如果您要翻译文本,则需要额外的东西
【解决方案3】:

您可能应该将文本分成 2 个文本视图,一个带有条款和条件,一个带有接受。这会使事情变得更清晰、更容易。以下 TextView 假设它只是为了接受。

在布局中对应的java类(例如:activity_main -> MainActivity):

public void start_activity(View view){
   Intent newActivityIntent = new Intent(this,NewActivity.class);
   startActivity(newActivityIntent);
}

NewActivity.class 只是您要启动的活动的名称。

public class MainActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
         ....
    }

    public void start_activity(View view){
         .....
    } 
}

【讨论】:

  • 但是,如果您使用onClick 事件,您将在全文中处理onClick 事件,而不仅仅是在“条款和条件”部分。
  • 是的,我忘了在顶部添加关于将文本分成 2 个视图的位
  • 我看到的问题是“条款和条件”没有正确填写,必须占据两行,它会占据第二个 TextView 的第二行,所以它会产生奇怪的行为。
  • 您可以设置 textView 以根据设备的尺寸改变大小。这是一个可以帮助stackoverflow.com/questions/9494037/…的答案的链接
  • 简单在 values 文件夹中的 dimens.xml 中。 &lt;dimen name="textsize"&gt;21sp&lt;/dimen&gt;&lt;TextView android:id="@+id/termsLink" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/terms" android:layout_weight="4" android:textSize="@dimens/textsize"/&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 2016-07-15
  • 1970-01-01
相关资源
最近更新 更多