EditText,TextView监听是否超过最大行数,显示省略号

来源:互联网 发布:服务器80端口被占用 编辑:程序博客网 时间:2024/06/05 20:20

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;    }}
阅读全文
3 0
原创粉丝点击