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。

  • 相关阅读:
    700. Search in a Binary Search Tree
    100. Same Tree
    543. Diameter of Binary Tree
    257. Binary Tree Paths
    572. Subtree of Another Tree
    226. Invert Binary Tree
    104. Maximum Depth of Binary Tree
    1、解决sublime打开文档,出现中文乱码问题
    移植seetafaceengine-master、opencv到ARM板
    ubuntu16.04-交叉编译-SeetaFaceEngine-master
  • 原文地址:https://www.cnblogs.com/renhui/p/5994142.html
Copyright © 2011-2022 走看看