zoukankan      html  css  js  c++  java
  • Android TextView 常用技巧

    TextView在Android中实现文字说明等功能,基本的使用都很简单,那么除了基本展示文字的使用,我们还能够经常使用TextView实现如下的功能:

    1.显示丰富的文本(URL、字体大小、颜色等)

    TextView中预定了一些类似Html的标签,通过标签可以使TextView显示不同的颜色、大小、字体的文字。

    • <font> : 设置颜色和字体
    • <big>: 设置大号
    • <small>: 设置小号
    • <i><b>: 斜体、粗体
    • <a>: 链接地址
    • <img>: 插入图片

    使用这些标签可以使用Html.fromHtml方法。

    2.将文本中的URL地址、邮箱地址、电话产生超链接的效果

    使用android:autoLink来设置,首先在的layout文件夹里面TextView控件增加

    android:autoLink="all"
    

    然后在Java中进行设置:

    textview.setMovementMethod(LinkMovementMethod.getInstance());
    

    这样展示出现的内容就可以出现超链接的效果。例如,在TextView点击网址链接后,就可以调转到浏览器并打开响应的链接。内容可以是Html格式的内容,也可以是String格式的,在使用Html显示超链接的时候,必须保证添加上协议好,例如:http://。否则在识别网址的时候,不加的话,可能会判断为Activity,然后导致崩溃。使用String格式的内容,在TextView添加setAutoLinkMask(Linkify.ALL)设置之后,可以不加协议识别出来链接,但是推荐还是加上。而这两种方法,都得设置一下setMovementMethod,才会跳转。   

    3.TextView显示表情图像和文字

    如果需要在TextView里面展示res资源里面的图片的话,可以通过编写html内容,并通过Html.fromHtml方法来将内容转换为CharSequence来显示。

    显示的核心代码:

    String html = "图像1<image='image1'>";  // 其中image1就是图片在drawable的name
    Html.fromHtml(html, new ImageGetter() {
    
        @Overrride
        public Drawable getDrawable(String source) {
             Drawable drawable = getResource.getDrawable(getResourceId(source));
             return drawable;
        }
    }
    
    public int getResourceId(String name) {
    	try {
    		// 根据资源ID的变量名获得Field的对象,使用反射机制来实现的
    		Field field = me.renhui.drag_sort_listview.R.drawable.class.getField(name);
    		// 取得并返回资源的id的字段(静态变量)的值,使用反射机制
    		return Integer.parseInt(field.get(null).toString());
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    	return 0;
    } 

    4.TextView单击链接触发点击事件(本例事件是弹出Activity也可以替换为其他事件)

    通过对TextView的内容设置span来给TextView设置点击事件,这样的话就能够通过点击点击TextView中的链接来弹出Activity

    String text1 = "弹出Activity1";
    String text2 = "弹出Activity2";
    SpannableString spannableString  = new SpannableString (text1);
    SpannableString spannableString2  = new SpannableString (text2);
    
    spannableString.setSpan(new ClickableSpan() {
        @Overrride
        public void onclick(View widge) {
              // TODO 实现弹出逻辑
        }    
    }, 0, text1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
     

    5.TextView实现跑马灯的效果

    基本的实现方式就是在xml设置TextView的属性:

    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:focusable="true"
    android:focusableInTouchMode="true"   // 不添加这个属性不能成功跑动起来 

    6. TextView 实现删除线的效果

    设置删除线的方式如下:

    通过按位或运算符|,将 TextView 原本的 Flags 属性和删除线一块设置。setPaintFlags内会对 TextView 进行重绘:

    tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

    获取画笔后设置属性,重绘 TextView 。此方式有个问题,会把 TextView 原本的 Flags 属性替代,例如抗锯齿等。仔细查看,你会发现通过这种方式,文字有了锯齿。此时需要添加如下代码来优化一下:

    tv.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
    tv.invalidate();

    TextView 取消删除线有两种方式:

    方式一(推荐)

    先对 Paint.STRIKE_THRU_TEXT_FLAG 属性取反,再用按位与运算符&,除去了删除线属性并保留了 TextView 原本的 Flags 属性。setPaintFlags内会对 TextView 进行重绘。

    tv.setPaintFlags(tv.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));

    方式二:

    获取画笔后,清空 Flags 属性,再重绘 TextView 。此方式有个问题,会把 TextView 原本的所有 Flags 属性清空,例如抗锯齿等。仔细查看,你会发现通过这种方式,文字有了锯齿;

    tv.getPaint().setFlags(0);
    tv.invalidate();

    7. TextView 出现异常换行的处理方法

       // 半角转换成全角
       private String toSBC(String input) {
            char c[] = input.toCharArray();
            for (int i = 0; i < c.length; i++) {
                if (c[i] == ' ') {
                    c[i] = 'u3000';
                } else if (c[i] < '177') {
                    c[i] = (char) (c[i] + 65248);
                }
            }
            return new String(c);
        }
    
      
        // 全角转换成半角
        private String toDBC(String input) {
            char[] c = input.toCharArray();
            for (int i = 0; i < c.length; i++) {
                if (c[i] == 12288) {
                    //全角空格为12288,半角空格为32
                    c[i] = (char) 32;
                    continue;
                }
                if (c[i] > 65280 && c[i] < 65375)
                    //其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
                    c[i] = (char) (c[i] - 65248);
            }
            return new String(c);
        }

     8. TextView 一行,最多显示10个字符,剩余的用...代替

    mTitleTxt.setSingleLine(); // 单行显示
    mTitleTxt.setMaxEms(10); // 最大十个字符
    mTitleTxt.setEllipsize(TextUtils.TruncateAt.END); // 剩余的以...结尾

    9. TextView 展示字母的时候,明明是小写,但界面上看到的都是大写 解决方案

    添加属性:

    android:textAllCaps="false"

    这个问题也存在于Button等其他控件,解决的方案同TextView。

  • 相关阅读:
    一文让你明白Redis持久化
    spring-data-redis 2.0 的使用
    中间自适应布局的5种解法
    php实现只需要一个QQ号就可以获得用户信息
    基于LINUX下的进程管理问题
    【初码干货】记一次分布式B站爬虫任务系统的完整设计和实施
    初码-爬虫系列-文章目录
    初码-阿里云系列-文章目录
    初码-Azure系列-存储队列的使用与一个Azure小工具(蓝天助手)
    初码-Azure系列-记一次MySQL数据库向Azure的迁移
  • 原文地址:https://www.cnblogs.com/renhui/p/5994142.html
Copyright © 2011-2022 走看看