盒子
盒子
文章目录
  1. TextWatcher
  2. 改变TextView中部分内容
  3. xml实现省略号表示剩余内容
  4. 文本折叠
    1. 自定义实现
    2. ExpandableTextView

探索TextView

TextWatcher

TextView内容变化监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
textView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
Log.i(TAG,"c:"+charSequence+" i:"+i+" i1:"+i1+" i2:"+i2);
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
Log.i(TAG,"c:"+charSequence+" i:"+i+" i1:"+i1+" i2"+i2);
}
@Override
public void afterTextChanged(Editable editable) {
Log.i(TAG,"editable:"+editable.toString());
}
});

  • beforeTextChanged(CharSequence s, int start, int count, int after)
  • 该方法在文本改变之前调用,传入了四个参数:

    1. CharSequence s:文本改变之前的内容
    2. int start:文本开始改变时的起点位置,从0开始计算
    3. int count:要被改变的文本字数,即将要被替代的选中文本字数
    4. int after:改变后添加的文本字数,即替代选中文本后的文本字数

    在当前文本s中,从start位置开始之后的count个字符(即将)要被after个字符替换掉

  • onTextChanged(CharSequence charSequence, int i, int i1, int i2)
  • 该方法在文本改变时调用,传入了四个参数:

    1. CharSequence charSequence:文本改变之后的内容
    2. int i:文本改变的时的起点位置,从0开始计算
    3. int i1:要被改变的文本字数
    4. int i2:改变后添加的文本字数

    在当前文本charSequence中,从start位置开始之后的before个字符(已经)被count个字符替换掉了

  • public void afterTextChanged(Editable editable)
  • 该方法在文本改变之后调用,传入了1个参数:

    1. Editable editable:改变后的最终文本

    该方法是在执行完beforeTextChanged、onTextChanged两个方法后才会被调用,此时的文本editable为最终显示给用户看到的文本。我们可以再对该文本进行下一步处理,比如把文本editable显示在UI界面上

    改变TextView中部分内容

    1
    2
    3
    4
    5
    6
    7
    ForegroundColorSpan foreground=new ForegroundColorSpan(ContextCompat.getColor(context,R.color.colorAccent));
    BackgroundColorSpan background=new BackgroundColorSpan(ContextCompat.getColor(context,R.color.colorPrimary));
    SpannableStringBuilder builder=new SpannableStringBuilder(textView.getText().toString());
    builder.setSpan(foreground,0,4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    builder.setSpan(background,6,9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    builder.setSpan(new AbsoluteSizeSpan(60),6,9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    textView.setText(builder);

    注意:

    0,4 指的是第一个值到第四个值,并不是第五个

    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE

    在改变部分的前后新增内容都不发生改变

    Spanned.SPAN_INCLUSIVE_EXCLUSIVE

    在改变部分的前面新增内容会改变在后面新增内容不发生改变

    xml实现省略号表示剩余内容

    1
    2
    android:lines="1"
    android:ellipsize="end"

    文本折叠

    自定义实现

    ViewTreeObserver

    视图树观察器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    public class TextVieWer extends AppCompatActivity {
    private static final String TAG=TextVieWer.class.getSimpleName();
    private TextView textView;
    private String str;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_textviwer);
    textView=findViewById(R.id.textView);
    str=textView.getText().toString();
    //设置TextView可点击
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    //添加视图树观察器,以避免在布局控件还未完全初始化前操作控件而报错
    ViewTreeObserver observer=textView.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
    ViewTreeObserver observer=textView.getViewTreeObserver();
    observer.removeOnGlobalLayoutListener(this);
    Log.i(TAG,"textView.getLineCount(): "+textView.getLineCount());
    if(textView.getLineCount()>2){
    //获取前二行的字数
    int lineEnd=textView.getLayout().getLineEnd(1);
    Log.i(TAG,"lineEnd: "+lineEnd);
    //截取前两行字数个数-3的字,然后再添加省略号
    str=str.subSequence(0,lineEnd-3)+"...";
    Log.i(TAG,"str: "+str);
    textView.setText(getClickableSpan(str,lineEnd));
    }
    }
    });
    }
    //对省略号进行操作,添加点击事件监听,和改变省略号颜色与大小
    private SpannableString getClickableSpan(String str,int count) {
    //指定部分字体监听器创建
    class Listener extends ClickableSpan implements View.OnClickListener{
    @Override
    public void onClick(View view) {
    Toast.makeText(TextVieWer.this, "Click Success", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void updateDrawState(TextPaint ds) {
    super.updateDrawState(ds);
    ds.setUnderlineText(false);
    }
    }
    SpannableString spanableInfo = new SpannableString(str);
    BackgroundColorSpan colorSpan=new BackgroundColorSpan(ContextCompat.getColor(this,R.color.white));
    ForegroundColorSpan colorSpan1=new ForegroundColorSpan(ContextCompat.getColor(this,R.color.colorPrimary));
    spanableInfo.setSpan(new AbsoluteSizeSpan(100),count-3, count,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spanableInfo.setSpan(new Listener(), count-3, count, Spanned.SPAN_MARK_MARK);
    spanableInfo.setSpan(colorSpan,count-3,count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spanableInfo.setSpan(colorSpan1,count-3,count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return spanableInfo;
    }
    }

    视图树观察器还可用于在onCreate方法中获取View的宽高:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private int mHeaderViewHeight;
    private View mHeaderView;
    mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
    new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
    mHeaderViewHeight = mHeaderView.getHeight();
    mHeaderView.getViewTreeObserver()
    .removeGlobalOnLayoutListener(this);
    }
    });
    }

    ExpandableTextView

    Android提供的可折叠TextView

    以下代码来自于:

    可折叠TextView控件使用:ExpandableTextView

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <com.ms.square.android.expandabletextview.ExpandableTextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:expandableTextView="http://schemas.android.com/apk/res-auto"
    android:id="@+id/expand_text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    expandableTextView:maxCollapsedLines="4"
    expandableTextView:animDuration="200">
    <TextView
    android:id="@id/expandable_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:textSize="16sp"
    android:textColor="#666666" />
    <ImageButton
    android:id="@id/expand_collapse"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:layout_gravity="right|bottom"
    android:background="@android:color/transparent"/>
    </com.ms.square.android.expandabletextview.ExpandableTextView>
    1
    2
    ExpandableTextView expTv1 = (ExpandableTextView) findViewById(R.id.expand_text_view);
    expTv1.setText(getString(R.string.dummy_text1));

    ExpandableTextView演示

    支持一下
    扫一扫,支持Grooter
    • 微信扫一扫
    • 支付宝扫一扫