您的位置:首页 > 其它

TextView入门

2015-07-31 22:43 316 查看

常用属性

ems:em的复数形式,指的是TextView的宽度是em的几倍。em,equal 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返回值。

打开链接

方法一:最简单方法是在布局中配置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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: