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.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG ); //中间横线

但是单纯使用这句话,会发现,TextView里面的内容出现锯齿的现象,所以配合使用的代码为:

textview.getPaint().setAntiAlias(true);// 抗锯齿

附带下划线的代码:

textview.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线

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。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以使用SpannableStringBuilder类来实现TextView中嵌套TextView的效果。具体步骤如下: 1. 创建一个外部的TextView,设置它的text为一个SpannableStringBuilder对象。 2. 在SpannableStringBuilder对象中插入需要嵌套的TextView,使用setSpan()方法将TextView对象作为参数传入。 3. 设置TextView的布局参数,使其可以适应外部TextView的尺寸。 以下是示例代码: ``` TextView outerTextView = findViewById(R.id.outer_text_view); SpannableStringBuilder builder = new SpannableStringBuilder(); TextView innerTextView = new TextView(this); innerTextView.setText("Inner TextView"); builder.append("Outer TextView "); builder.setSpan(new MySpannable(innerTextView), builder.length(), builder.length() + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); outerTextView.setText(builder); outerTextView.setMovementMethod(LinkMovementMethod.getInstance()); class MySpannable extends ClickableSpan { private TextView textView; public MySpannable(TextView textView) { this.textView = textView; this.textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } @Override public void onClick(View widget) { // Do something when inner TextView is clicked } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setColor(ds.linkColor); // Use link color for inner TextView ds.setUnderlineText(false); } @Override public void drawBackground(Canvas canvas, Paint paint, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum) { // Do not draw background for inner TextView } } ``` 在上面的代码中,我们创建了一个内部TextView对象,并将它作为参数传入MySpannable类的构造方法中。然后,使用setSpan()方法将MySpannable对象插入到SpannableStringBuilder对象中,从而实现了TextView的嵌套效果。 注意,为了使内部TextView能够响应点击事件,需要调用setMovementMethod()方法并传入LinkMovementMethod.getInstance()。此外,还需要重写MySpannable类的updateDrawState()方法来设置内部TextView的颜色,以及重写drawBackground()方法来取消内部TextView的背景色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值