TextView入门

常用属性

        ems:em的复数形式,指的是TextView的宽度是em的几倍emequal M的缩写,一种长度单位(html中有用),它指的是字符M的宽度(字母中只有W与M的宽度相仿,其余的都比M窄,所有的汉字都占一个em宽度)。利用该属性可以设置文字垂直显示(或者指定每行显示的文字个数),如:

    <TextView
        android:ems="1"
        android:text="天地之间有杆称"
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:textColor="@android:color/white"/>

效果图为:


         如果将ems属性值设为2,那么每一行就显示两个汉字。如果将text属性换成字母,那么每一行也有可能显示两个字母,因为一个m的宽度可以放两个别的字母(除w外)。

常用方法

        getCompoundPaddingLeft()与getPaddingLeft():当textview设置了drawableLeft等属性后两者有区别,前者指文字距离view左边距离,后者指图片距离view左边距离;当没有设置drawabeLeft等属性时,两者是无区别的。如下:


        其中最上面设置的是getCompoundPaddingLeft返回值,下面设置的是getPaddingLeft返回值。

        onTextContextMenuItem(int id):当context menu的item被点击时,回调该方法。例如常用的复制、粘贴、裁剪等功能就会回调到该方法中。例如:

  @Override
    public boolean onTextContextMenuItem(int id) {
        // 处理粘贴操作
        if (id == android.R.id.paste) {
            return true;
        }
        // Call super
        return super.onTextContextMenuItem(id);
    }
        此时自己处理了粘贴操作(虽然这里面什么操作也没有进行),系统自身的粘贴功能就会失效。

        onCreateContextMenu():创建一个context menu。一般的textview,长按是会出现复制、粘贴等功能。但如果自己设置了long click listener,并且将返回值设置为true,则不会出现复制、粘贴的dialog。

        onSelectionChanged(int selStart, int selEnd):当选择的范围变化时回调该方法——无论是移动单纯的移动光标,还是长按后选择一个内的文字都会回调该方法。当单纯的移动光标时,selStart与selEnd值相同,当选择一个文字块时两者值不同。

打开链接

        方法一:最简单方法是在布局中配置autoLink属性即可。它会自动的将要进行链接的部分标识出来。
        方法二:加载html文本:示例:
 tv.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."));
       tv.setMovementMethod(LinkMovementMethod.getInstance());
注意:
        
setMovementMethod()必须要设置的不然就是直接显示html文本定义的样式,但是不会有链接。另外,该方法是和autoLink属性冲突。如果两个一起设置的话,不会有链接效果。
方法三:
       相当于方法二的变种。方法二是在代码中控制的,也可以直接在布局文件中写。把html文本当作strings.xml中的一个<item>,然后在布局中引用,并且在代码中该textview调用setMovementMethod()。
方法四:
示例
        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());

启动新activity        

        假设textview显示许多文字,点击其中的某些文字启动新的activity。该功能类似于上面的点击文字打开链接,但由于启动activity并不是链接,所以上面的四个方法中前三个都不能用。对于方法四,它主要是利用了SpannableString.setSpan()设置一些字体样式或者链接,同样也可以设置点击事件。示例如下:

		SpannableString ss = new SpannableString("注:医生只,具体请点击这里进行咨询.");
		// 设置颜色
		ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2,
				SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
		int length = ss.length();
		// 设置点击
		ss.setSpan(new ClickableSpan() {
			@Override
			public void onClick(View widget) {
				System.out.println("点击了");//perform click
			}
		}, length - 9, length - 5, SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
		ss.setSpan(new ForegroundColorSpan(Color.RED), length - 9, length - 5,
				SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
		TextView tv = new TextView(this);
		tv.setMovementMethod(LinkMovementMethod.getInstance());
		tv.setText(ss);
        SpannableString.setSpan()中的第一个参数见SpannableString

样式

textStyle属性:bold加粗,italic:倾斜。可以用"|"分隔,选择多个值。
下划线:使用html标签中的<u>标签。如:
tv.setText(Html.fromHtml("<u>" + et.getText().toString() + "</u>"));

跑马灯

方法一:
       在布局中添加以后属性:
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:singleLine="true"
        这个方法有一个弊端:因为中跑马灯效果必须是在textview获取焦点的情况下才会发生的,所以当tv没有焦点时,该效果就不会出现。例如:当点击同一个界面中的edit_text时,该tv的跑马灯效果就会消失。
        方法二:自定义。继承TextView,重写isFocused(),返回true即可。这种方法的跑马灯是不会出现方法一中的弊端的。但布局文件中仍旧需要写:
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"
        android:singleLine="true"
上述的三个属性中:第一个指定的是使用跑马灯效果,第二个是跑马灯重复的次数,第三个是指定tv为1行。

图文混排

使用html

        由于android支持html中的<img>标签,所以可以用使用textview加载html语言,从而加载本地图片。例如一段html语句如下:
表情一<img src=\"emoji_0\"/>表情二<img src=\"emoji_1\"/>表情三<img src=\"emoji_2\"/>表情四<img src=\"emoji_3\"/>哇哈哈,美女哟!!!!
textview对应的代码为:
tv.setText(Html.fromHtml(test, new ImageGetter() {
					/*
					 * source的值就是<img>标签中src属性的值。在第一个img标签时,source的值就是emoji_0.
					 * 因此在为src属性赋值时,后面不要带后缀名(不能写成:emoji_0.png)。
					 * src的值就是该图片在R.drawable对应的名称。
					 */
					public Drawable getDrawable(String source) {
						//根据图片名得到图片在本地的id
						int id = getDrawableId(source);
						System.out.println(source + ":" + id);
						Drawable drawable = getResources().getDrawable(id);
						drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
								drawable.getIntrinsicHeight());
						return drawable;
					}
				}, null));
其中getDrawableId方法为:
    /**
     * 根据图片名获取对应的id 
     * @param faceName:图片名称,不带后缀 
     * @return 加载错误后返回应用图标
     */
    private int getDrawableId(String faceName) {
        try {
            Class<R.drawable> drawable = R.drawable.class;//R.drawable是一个类  
            Field field;
            field = drawable.getDeclaredField(faceName);
            return field.getInt(null);
        } catch (Exception e) {
            e.printStackTrace();
            return R.drawable.ic_launcher;
        }
    }
注意:
        <img>标签中的src属性值不能带后缀名,应该如对应的图片在R.drawable中的名称一致。

html简单方式

        由于ImageGetter.getDrawable()的参数值是html中src的值,所以可以写成如下的简单方式:
String html = "<img src='" + R.drawable.ic_launcher + "'/>";
		ImageGetter imgGetter = new ImageGetter() {
			@Override
			public Drawable getDrawable(String source) {
				int id = Integer.parseInt(source);
				Drawable d = getResources().getDrawable(id);
				d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
				return d;
			}
		};
		CharSequence charSequence = Html.fromHtml(html, imgGetter, null);
		b.setText(charSequence);
        在上面,直接将src的值设置到图片的id,所以在getDrawable()中先强转成int,然后获取相应的drawable对象。要注意的是: R.drawable.ic_launcher必须用单引号包裹起来
注意
        在ImageGetter中得到对应的drawable后,一定要重新设置drawable的大小,不然不显示(因为drawable默认的大小是0*0),方法就是drawable.setBounds()。

使用ImageSpan

        参见SpannableString中的imageSpan
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值