zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    grub
    init
    内核的ramdisk
    kernel信息及其相关命令
    mvc和mvvm模式
    vue从零开始(一)
    echarts自动播放图形
    echarts自定义悬浮框的显示
    typescript入门
    echarts的最外层配置项
  • 原文地址:https://www.cnblogs.com/malinkang/p/3216950.html
Copyright © 2011-2022 走看看