【Android Widget】1.TextView

1.创建可被点击的TextView

 1.1 在xml中创建可被点击的TextView

android:autoLink 是否将符合指定格式的文本转换成可单击的超链接。

属性值可以是如下几个属性值的一个或多个,多个属性值之间用竖线隔开。

  • none:不设置任何超链接。
  • web:将文本中的URL地址转换为超链接。
  • email:将文本中的email地址转换为超链接。
  • phone:
  • map:将文本中地址转换为超链接。
  • all:全部转换为超链接。
 <TextView
            android:id="@+id/text1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:autoLink="all"
            android:paddingBottom="8dp"
            android:text="@string/link_text_auto"
            android:textAppearance="?android:attr/textAppearanceMedium" />

link_text_auto

<string name="link_text_auto"><b>text1: Various kinds
      of data that will be auto-linked.</b>  In
      this text are some things that are actionable.  For instance,
      you can click on http://www.google.com and it will launch the
      web browser.  You can click on google.com too.  If you
      click on (415) 555-1212 it should dial the phone.  Or just write
      foobar@example.com for an e-mail link.  If you have a URI like
      http://www.example.com/lala/foobar@example.com you should get the
      full link not the e-mail address.  Or you can put a location
      like 1600 Amphitheatre Parkway, Mountain View, CA 94043.  To summarize:
      https://www.google.com, or 650-253-0000, somebody@example.com,
      or 9606 North MoPac Expressway, Suite 400, Austin, TX 78759.
    </string>

1.2 在代码调用setMovemoentMethod()方法设置超链接被点击:

  TextView t2 = (TextView) findViewById(R.id.text2);
 t2.setMovementMethod(LinkMovementMethod.getInstance());
 <TextView
            android:id="@+id/text2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="8dp"
            android:paddingTop="8dp"
            android:text="@string/link_text_manual"
            android:textAppearance="?android:attr/textAppearanceMedium" />

link_text_manual

 <string name="link_text_manual"><b>text2: Explicit links using &lt;a&gt; markup.</b>
      This has markup for a <a href="http://www.google.com">link</a> specified
      via an &lt;a&gt; tag.  Use a "tel:" URL
      to <a href="tel:4155551212">dial a phone number</a>.
    </string>

1.3 使用代码中使用html创建带超链接的文本

 TextView t3 = (TextView) findViewById(R.id.text3);
        t3.setText(
            Html.fromHtml(
                "<b>text3: Constructed from HTML programmatically.</b>  Text with a " +
                "<a href="http://www.google.com">link</a> " +
                "created in the Java source code using HTML."));
        t3.setMovementMethod(LinkMovementMethod.getInstance());

1.4 代码中不使用html创建带超链接的文本

SpannableString:http://orgcent.com/android-textview-spannablestring-span/
http://developer.android.com/reference/android/text/style/CharacterStyle.html

        SpannableString ss = new SpannableString(
            "text4: Manually created spans. Click here to dial the phone.");

        ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 30,
                   Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new URLSpan("tel:4155551212"), 31+6, 31+10,
                   Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        TextView t4 = (TextView) findViewById(R.id.text4);
        t4.setText(ss);
        t4.setMovementMethod(LinkMovementMethod.getInstance());

1.5 点击部分TextView跳转到另外一个Activity

有时候我们需要实现点击部分TextView跳转到另外一个Activity比如微博中的@功能。

通过跟踪TextView的源码,我们发现TextView支持的链接是由android.text.style.URLSpan这个类实现的,它重写了一个onClick方法:

    @Override
    public void onClick(View widget) {
        Uri uri = Uri.parse(getURL());
        Context context = widget.getContext();
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
        context.startActivity(intent);
    }

    大家看到了吧startActivity,多么熟悉的方法。既然它能实现,为什么我们不能呢,答案是可以的。我们接着跟踪代码,可以看到URLSpan其实继承的是android.text.style.ClickableSpan,我们来看一下他的源码:

/**
 * If an object of this type is attached to the text of a TextView
 * with a movement method of LinkMovementMethod, the affected spans of
 * text can be selected.  If clicked, the {@link #onClick} method will
 * be called.
 */
public abstract class ClickableSpan extends CharacterStyle implements UpdateAppearance {

    /**
     * Performs the click action associated with this span.
     */
    public abstract void onClick(View widget);
   
    /**
     * Makes the text underlined and in the link color.
     */
    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setColor(ds.linkColor);
        ds.setUnderlineText(true);
    }
}

 我们直接继承这个类,重写他的方法就可以了

实例:点击文本中的每一个字母跳转到另一个Activity并显示 

效果:

 

点击The 则进入OtherActivity

自定义MyURLSpan

public class MyURLSpan extends ClickableSpan {

    private final String tag;

    public MyURLSpan(String tag) {
        // TODO Auto-generated constructor stub
        this.tag = tag;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        //设置字体颜色 
        ds.setColor(Color.BLUE);
        //去掉下划线
        ds.setUnderlineText(false);
    }

    @Override
    public void onClick(View widget) {
        Context context = widget.getContext();
        Intent intent = new Intent(context, OtherActivity.class);
        intent.putExtra("tag", tag);
        context.startActivity(intent);

    }

}

使用MyURLSpan

public class MainActivity extends Activity {
    private final String str = "The Obama administration said Wednesday it would take action against the Syrian government even without the backing of allies or the United Nations because diplomatic paralysis must not prevent a response to the alleged chemical weapons attack"
            + " outside the Syrian capital last week ";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SpannableString ss = new SpannableString(str);
        int fromIndex = 0;
        while (str.indexOf(" ", fromIndex) != -1) {
            int endIndex = str.indexOf(" ", fromIndex);
            ss.setSpan(new MyURLSpan(str.substring(fromIndex, endIndex)), fromIndex, endIndex,
                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            fromIndex = endIndex + 1;
        }
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText(ss);
        tv.setMovementMethod(LinkMovementMethod.getInstance());
    }

}

 代码下载:http://url.cn/TLpCDZ

2.一些常用属性

android:ellipsize属性可支持如下几个属性值

  • none:不进行任何处理。
  • start:在文本开头部分进行省略。
  • middle:在文本中间部分进行省略。
  • end:在文本结尾处进行省略。
  • marquee:在文本结尾处以淡出的方式省略。
参考

http://zhangning290.iteye.com/blog/1134286

原文地址:https://www.cnblogs.com/malinkang/p/3216950.html