常用属性
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返回值。
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值相同,当选择一个文字块时两者值不同。
打开链接
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的跑马灯效果就会消失。
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
上述的三个属性中:第一个指定的是使用跑马灯效果,第二个是跑马灯重复的次数,第三个是指定tv为1行。
图文混排
使用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;
}
}
注意:
html简单方式
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必须用单引号包裹起来
。