前言:该篇介绍了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中同时显示文字和图片( 注:无法控制图片的大小)


以下图片及使用借鉴于:;






android textview 灰色背景 textview背景颜色_文字颜色



效果图:




android textview 灰色背景 textview背景颜色_文字颜色_02



注意:两张图片都嵌入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,而不同区域的文字颜色不一样,且又要能实现能够点击事件


先看看最终的效果图:


android textview 灰色背景 textview背景颜色_textview_03



在上图中,我们使用一个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;


            }


        });