自定义EditText,TextView监听是否超过最大行数,显示省略号
2017-12-08 17:00
381 查看
1.概述
我们给TextView或者EditTextViwe设置最大行数,超过最大行时我们没有相应的回调,这样当想处理超过最大行数的逻辑时就没有相应的方法,下面我自定义了有监听超过最大行数的EditText和TextView效果图
下面的效果图textView设置成输入editTextView的字体,他们的最大行数都设置2行,超过最大行数和不超过分别设置成不同的字体颜色图
效果图代码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.geely.mars.mvpdemo.activity.view.OverLineEdixView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editext" android:textSize="30sp" android:maxLines="2" android:ellipsize="end"/> <com.geely.mars.mvpdemo.activity.view.OverLineTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="2" android:textSize="30sp" android:id="@+id/textview" android:ellipsize="end"/> </LinearLayout>
package com.geely.mars.mvpdemo.activity.view; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.Nullable; import android.text.Editable; import android.text.TextWatcher; import com.geely.mars.mvpdemo.R; public class ActMain extends Activity { private OverLineEdixView edixView; private OverLineTextView textView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act_main); edixView = findViewById(R.id.editext); textView = findViewById(R.id.textview); initView(); setListener(); } private void initView() { edixView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { textView.setText(editable.toString()); } }); } private void setListener() { edixView.setOnOverLineChangerListener(new OverLineEdixView.OnOverLineChangerListener() { @Override public void onOverLine(boolean inOverLine) { if (inOverLine){ edixView.setTextColor(Color.parseColor("#ff0000")); }else { edixView.setTextColor(Color.BLACK); } } }); textView.setOnOverLineChangerListener(new OverLineTextView.OnOverLineChangerListener() { @Override public void onOverLine(boolean inOverLine) { if (inOverLine){ textView.setTextColor(Color.RED); }else { textView.setTextColor(Color.parseColor("#00ff00")); } } }); } }
3.具体的实现代码
代码比较简答 就直接贴代码,关键地方有相关注释OverLineEdixView
package com.geely.mars.mvpdemo.activity.view; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.os.Build; import android.support.v7.widget.AppCompatEditText; import android.text.Layout; import android.util.AttributeSet; import android.view.ViewTreeObserver; public class OverLineEdixView extends android.support.v7.widget.AppCompatEditText { private OnOverLineChangerListener listener; private AppCompatEditText normalStatu; public OverLineEdixView(Context context) { super(context); init(); } public OverLineEdixView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public OverLineEdixView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { normalStatu=this; getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (listener!=null){ listener.onOverLine(isOverLine()); } } }); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (listener!=null){ listener.onOverLine(isOverLine()); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private boolean isOverLine() { int lineCount = getLineCount(); int maxLines = getMaxLines(); return lineCount > maxLines; } interface OnOverLineChangerListener{ void onOverLine(boolean inOverLine); } public void setOnOverLineChangerListener(OnOverLineChangerListener listener){ this.listener=listener; } }
OverLineTextView
package com.geely.mars.mvpdemo.activity.view; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.os.Build; import android.text.Layout; import android.util.AttributeSet; import android.view.ViewTreeObserver; import android.widget.TextView; import java.lang.reflect.Field; public class OverLineTextView extends TextView { private boolean isOverSize; private OnOverLineChangerListener listener; public OverLineTextView(Context context) { super(context); init(); } public OverLineTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void init() { // invalidate when layout end getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (listener != null) { listener.onOverLine(checkOverLine()); } } }); } public boolean isOverSize() { return isOverSize; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (listener != null) { listener.onOverLine(checkOverLine()); } } public boolean checkOverLine() { //获取当前textview的行数 int maxLine = getLineCount(); try { Field field = getClass().getSuperclass().getDeclaredField("mLayout"); field.setAccessible(true); Layout mLayout = (Layout) field.get(this); if (mLayout == null) { return false; } //mLayout.getEllipsisCount获取textView对应行数索引出的省略的字符数,没有省略返回0 isOverSize = mLayout.getEllipsisCount(maxLine - 1) > 0 ? true : false; } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } return isOverSize; } interface OnOverLineChangerListener{ void onOverLine(boolean inOverLine); } public void setOnOverLineChangerListener(OnOverLineChangerListener listener){ this.listener=listener; } }
相关文章推荐
- TextView设置最大行数、或者最多显示6个字、结束时为省略号
- 让TextView显示指定的行数,超过部分用省略号代替
- 关于textview显示省略号和设置最大行数的问题
- TextView限制最大行数,多出部分显示省略号,解决ellipsize = "end" 失效的问题
- Android设置TextView显示指定个数字符,超过部分显示...(省略号)的方法
- 设置Textview最大长度,超出显示省略号
- 设置Textview最大长度,超出显示省略号
- TextView内容过长显示指定行数加省略号,点击显示全部内容
- Android TextView 判断文字内容是否超出显示省略号
- android EditText,textview显示 特殊字符及自定义字体
- TexView 设置最大字数 超过部分显示省略号
- TextView 设置超过几行后显示省略号
- Android中TextView实现超过固定行数显示“...展开全部”
- TextView设置最多显示指定个字符,超过部分显示...(省略号) 单行显示
- TextView设置最多显示指定个字符,超过部分显示...(省略号)
- android让textview设置规定行数,多余部分省略号显示
- 文字超过多行(自定义行数)就显示省略号
- 自定义TextView/EditText,实现显示(或输入)小数、数字前缀(¥$...)、千分符、最大值等
- Android中如何让TextView显示指定的行数并且多出的部分显示省略号
- 设置Textview最大长度,超出显示省略号