APP开发经验总结android技术专栏Android开发

Android TextView 点击超链接跳转实现

2017-11-05  本文已影响198人  Silence潇湘夜雨

前提:之前遇到过一次textview显示url的方式,但是并未深入探究。但是,上个礼拜一个朋友问我如何在textview上面加载url,并且点击跳转到指定页面。当时对这个比较感兴趣也就深入探究了一番。虽然实现了,但是效果并不理想。如果哪位看官对这一点,理解的比较深入,请告诉我一声,谢谢了。

首先

1、none:表示不进行任何匹配,默认;
2、Web:表示匹配Web Url, 如: 连接地址为http://www.baidu.com会成为可单击跳转的超链接;
3、Email:表示匹配邮件地址, 如:邮件地址为xx@sina.com会成为可单击的超链接;
4、Phone:表示匹配电话号码,如:点击号码10000会跳到拨号界面;
5、Map:表示匹配地图地址;
6、All:表示将会匹配web、email、phone、map;

如下图所示

TextView autoLink.png
 <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:layout_margin="16dp"
    android:text="123"
    android:autoLink="phone"/>

其次

1、直接跳转到指定页面(可以直接自定义页面);
2、通过手机浏览器到指定页面

首先,来看跳转到指定页面的写法

  public class MainActivity extends AppCompatActivity {

  TextView mTxtWeb;
  CharSequence mContent;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
  }

  /**
   * 初始化控件
   */
  private void initView() {
    mTxtWeb = (TextView) findViewById(R.id.txt_web);
    String htmlLinkText = "天下"+"www.google.com"+"为公";
    mTxtWeb.setText(Html.fromHtml(htmlLinkText));
    mTxtWeb.setMovementMethod(LinkMovementMethod.getInstance());
    CharSequence text = mTxtWeb.getText();
    if (text instanceof Spannable) {
        int end = text.length();
        Spannable sp = (Spannable) mTxtWeb.getText();
        URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
        SpannableStringBuilder style = new SpannableStringBuilder(text);
        style.clearSpans();
        for (final URLSpan url : urls) {
              //最主要的一点
            CustomClickUrlSpan myURLSpan = new CustomClickUrlSpan(url.getURL(), new CustomClickUrlSpan.OnLinkClickListener() {
                @Override
                public void onLinkClick(View view) {
                    Intent intent= new Intent(this,WebActivity.class);
                    intent.putExtra("url",url.getURL());
                    startActivity(intent);
                }
            });
            style.setSpan(myURLSpan, sp.getSpanStart(url), sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        mTxtWeb.setText(style);
    }
   }

其次,通过浏览器跳转到指定页面(并取消下划线)

public class CustomUrlSpan extends UnderlineSpan implements Parcelable {


String url;

public CustomUrlSpan(String url) {
    this.url = url;

}

@Override
public void updateDrawState(TextPaint ds) {
    super.updateDrawState(ds);
    if (ds != null) {
        ds.setUnderlineText(false);
    }
}


@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.url);
}

protected CustomUrlSpan(Parcel in) {
    super(in);
    this.url = in.readString();
}

public static final Creator<CustomUrlSpan> CREATOR = new Creator<CustomUrlSpan>() {
    public CustomUrlSpan createFromParcel(Parcel source) {
        return new CustomUrlSpan(source);
    }

    public CustomUrlSpan[] newArray(int size) {
        return new CustomUrlSpan[size];
    }
};
}

最后(还有一点比较困惑)

感悟

上一篇 下一篇

猜你喜欢

热点阅读