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。相关文章推荐
- SQLSERVER 检查字段值域并输出行数和值列表
- 远程登录linux的工具OpenSSH
- Find Minimum in Rotated Sorted Array
- Visual Studio 2008 Package Load Failure:未能正确加载包“Microsoft.VisualStudio.Xaml”
- HDU 4313 Matrix(贪心+并查集)
- mysql_fetch_array容易掉入的陷进
- J哥---------Android 多线程下载 仿下载助手(改进版)
- 局部内部类对外部属性和变量的访问测试
- 黑马程序员——走进面向对象
- Redis数据类型之字典
- 直接用socket实现HTTP下载
- JavaScript--时间显示小插件
- Go语言练习:go语言与C语言的交互——cgo
- Android大图片裁剪终极解决方案(下:拍照截图)
- objectiveC【语法】修饰符 static extern const
- Nginx常用命令介绍
- Oracle 学习之RMAN(十六)Catalog
- 我的书单
- Android Service与Activity之间通信的几种方式(1)---通过broadcast(广播)的形式
- Nginx学习总结