前言:该篇介绍了TextView的基础布局属性,文字过长处理,TextView同时显示图片及文字,同一个TextView不同区域的文字颜色及点击事件,TextView的触摸事件.
TextView的布局属性:
android:background:设置背景颜色
android:p adding:
android:textColor: 设置文本颜色
android:textColorHighlight:被选中文字的底色,默认为蓝色
android:hint:
android:textColorHint:设置提示信息文字的颜色,默认为灰色。与hint一起使用。
android:textColorLink:文字链接的颜色.
android:textScaleX:设置文字之间间隔,默认为1.0f。
android:typeface:设置文本字体
android:maxHeight:设置文本区域的最大高度
android:minHeight:设置文本区域的最小高度
android:maxWidth:设置文本区域的最大宽度
android:minWidth:设置文本区域的最小宽度
android:PaddingRight:设置文本文字与右边框的距离
android:paddingLeft:设置文本文字与左边框的距离
android:paddingBottom:设置文本文字与底边框的距离
android:paddingTop:设置文本文字与顶边框的距离
android:layout_marginLeft:设置文本与父控件的左距离
android:layout_marginRight:设置文本与父控件的右距离
android:layout_marginTop:设置文本与父控件的顶距离
android:layout_marginButton:设置文本与父控件的底距离
android:cursorVisible:设定光标为显示/隐藏,默认显示。
android:digits:设置允许输入哪些字符。如“1234567890.+-*/% ()”
android:singleLine="true"设置单行输入,一旦设置为true,则文字不会自动换行。
android:textScaleX="1.5" 控制字与字之间的间距
android:textStyle="bold" 设置字体样式,还有其他样式: italic, bolditalic
android:password="true"设置只能输入密码
android:editable:设置是否可编辑。
android:gravity :设置文本位置,如设置成“center”,文本将居中显示。
android:maxLength:限制显示的文本长度,超出部分不显示。
android:lines:设置文本的行数,设置两行就显示两行,即使第二行没有数据
android:phoneNumber:设置为电话号码的输入方式。
android:scrollHorizontally:设置文本超出TextView的宽度的情况下,是否出现横拉条。
android:numeric="integer"设置只能输入整数,如果是小数则是:decimal
Padding和Marigin之间的区别:PaddingRight是设置文字与边框的距离,MariginRight是设置边框与父控件的距离
TextView内容过长省略
EidtText和TextView中内容过长的话自动换行,使用android:ellipsize与android:singleine可以解决,使其只有一行。
EditText不支持marquee
用法如下:
android:singleline = "true"
android:ellipsize = "end" 省略号在结尾
android:ellipsize = "start" 省略号在开头
android:ellipsize = "middle" 省略号在中间
android:ellipsize = "marquee" 跑马灯
当然也可以用代码语句
tv.setEllipsize(TextUtils.TruncateAt.valueOf("END"));
tv.setEllipsize(TextUtils.TruncateAt.valueOf("START"));
tv.setEllipsize(TextUtils.TruncateAt.valueOf("MIDDLE"));
tv.setEllipsize(TextUtils.TruncateAt.valueOf("MARQUEE"));
tv.setSingleLine(true);
用TextView同时显示图片和文字
手工设置文本与图片相对位置时,常用到如下方法:
setCompoundDrawables(left, top, right, bottom);
setCompoundDrawablesWith
IntrinsicBounds(left, top, right, bottom)
意思是设置Drawable显示在TextView的左、上、右、下位置。将一张图片设置在TextView的位置上.
(
Textview、Button都可以
)
但是两者有些区别:
setCompoundDrawables 画的drawable的宽高是按drawable.setBound()设置的宽高,使用之前必须使用Drawable.setBounds设置Drawable的长宽。 而setCompoundDrawablesWithIntrinsicBounds是画的drawable的宽高是按drawable固定的宽高,即通过getIntrinsicWidth()与getIntrinsicHeight()获得! |
在Xml中同时显示文字和图片( 注:无法控制图片的大小)
以下图片及使用借鉴于:;
效果图:
注意:两张图片都嵌入TextView里,所以TextView的属性就是图片的属性,比如现在要做的效果图,就要注意上面的TextView设置的几个属性:
1>. TextView的宽度必须是math_parent,不然无法实现效果.
2>.想设置左边图片距离边框的距离:就要设置TextView的PaddingLeft属性,因为TextView已经占满了行屏幕,而右边图片想设置距离右边框的距离也是一样.
3>.如果不设置Padding属性的话,两张图片是无法实现在左右两边显示的效果的.
4>.如果我们需要显示的图片太大了的话,xml是没有办法实现缩小图片的大小,这时我们可以设置好 paddingLeft的属性,而设置呈现的图片(例:android:drawableLeft属性可以不设置),可以在代码中设置图片及其大小,然后TextView再加载图片,设置方法在后面有写.
在代码中设置TextView左右两边加载的图片及大小
TextView tv=(TextView) findViewById(R.id.tv);
Drawable drawable=getResources().getDrawable(R.drawable.pic1); //获取左边需要加载的图片
//drawable.setBounds(left, top, right, bottom);
drawable.setBounds(0,0,70,70);// 第一0是距左边距离,第二0是距上边距离,70分别是长宽
Drawable drawable2=getResources().getDrawable(R.drawable.pic2); //获取右边需要加载的图片
drawable2.setBounds(0,0,70,70);// 第一0是距左边距离,第二0是距上边距离,70分别是长宽
//tv.setCompoundDrawables(left, top, right, bottom); 左 顶 右 下 设置图片
tv.setCompoundDrawables(drawable,null,drawable2,null); //TextView加载左右需要的图片
同一个TextView不同区域的文字颜色及点击事件
有时我们需要实现这么一种效果,使用同一个TextView,而不同区域的文字颜色不一样,且又要能实现能够点击事件
先看看最终的效果图:
在上图中,我们使用一个TextView,要实现不同的文字颜色区别,且可以实现多个区域能够触发点击事件.
看下如何实现的:
PraiseEntity entity=new PraiseEntity();
entity.setName("朱小明");
entity.setTitle("点赞了你在");
entity.setFileName("珠三角各地级市政策比较分析");
entity.setEnd("的评论");
entity.setTime("2017.01.09 17:28");
int oldLength =entity.getName().length() +entity.getTitle().length();//获取文档名在TextView中的位置
SpannableString styledText = new SpannableString(entity.getName()+entity.getTitle()+ entity.getFileName()+entity.getEnd());//将需要呈现的文字全部放一起 holder.titleTv.setHighlightColor(ContextCompat.getColor(context,android.R.color.transparent)); styledText.setSpan(new Clickable(clickListener),0,entity.getName().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//设置姓名的点击事件及文字颜色 styledText.setSpan(new Clickable(click),oldLength,oldLength+entity.getFileName().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//设置文档的点击事件及文字颜色(注意:姓名与文档执行的点击事件是不同的,姓名的是clickListener,而文档的是click) holder.titleTv.setText(styledText, TextView.BufferType.SPANNABLE); holder.titleTv.setMovementMethod(LinkMovementMethod.getInstance()); holder.timeTv.setText(entity.getTime());
private View.OnClickListener clickListener=new View.OnClickListener() { // 姓名的点击事件
@Override
public void onClick(View v) {
Bundle bundle=new Bundle();
bundle.putBoolean("user",false);
bundle.putString("username",entity.getName());
ActivityUtil.goToActivity(context,UserSettingsActivity.class,bundle);
}
};
private View.OnClickListener click=new View.OnClickListener() { // 文档的点击事件
@Override
public void onClick(View v) {
LogUtils.e("点击文档了");
}
};
private class Clickable extends ClickableSpan {
private final View.OnClickListener mListener;
Clickable(View.OnClickListener l) {
mListener = l;
}
/**
* 重写父类点击事件
*/
@Override
public void onClick(View v) {
mListener.onClick(v);
}
/**
* 重写父类updateDrawState方法 我们可以给TextView设置字体颜色,背景颜色等等...
*/
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(ContextCompat.getColor(context, R.color.bbb2));
}
}
这样,我们就可以根据点击的是姓名还是文档,触发不同的事件,执行不同的点击事件了
TextView触摸监听方法:
TextView tv=(TextView)findViewById(R.id.textView1);
tv.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent arg1) {
//判断动作数字代码
switch(arg1.getAction()){
case MotionEvent.ACTION_DOWN://按下
tv.setText("按下");
break;
case MotionEvent.ACTION_UP://抬起
tv.setText("抬起");
}
return true;
}
});