Android实现可收缩和扩展的TextView

在Android原生的TextView的基础上,可收缩/扩展的TextView:PhilExpandableTextView。

实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时候,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常显示需要显示的总行数,但只给TextView设置最大运行的行数(小于总行数),从而造成TextView的收缩摘要效果,当用户通过按钮或其他方式扩展时候,把TextView的最大行数设置为正常显示完全的行数+1(+1是保持余量,避免不足)。

public class MainActivity extends Activity { private String str = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); for (int i = 0; i < 200; i++) { str = str + i + " "; } final ExpandableTextView etv = (ExpandableTextView) findViewById(R.id.etv); etv.setText(str); Button btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { boolean b = etv.getExpandablestatus(); b = !b; etv.setExpandable(b); } }); } }

PhilExpandableTextView.java:

package com.ganchuanpu.ExpandableTextView; import android.content.Context; import android.util.AttributeSet; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnPreDrawListener; import android.widget.TextView; import android.widget.Toast; public class ExpandableTextView extends TextView { // 最大行,默认显示3行 private final int MAX = 3; // 完全展开需要的行数 private int lines; private ExpandableTextView mExpandableTextView; private boolean expandablestatus = false; // 构造方法用两个参数的 public ExpandableTextView(Context context, AttributeSet attrs) { super(context, attrs); mExpandableTextView = this; init(); } private void init() { // 在view绘制之前的时候执行,在onDraw之前 ViewTreeObserver mViewTreeObserver = this.getViewTreeObserver(); mViewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() { @Override public boolean onPreDraw() { // 避免重复监听 mExpandableTextView.getViewTreeObserver().removeOnPreDrawListener(this); // 获得内容行数 lines = getLineCount(); return true; } }); setExpandable(false); } // 是否展开或者收缩, // true,展开; // false,不展开 public void setExpandable(boolean isExpand) { if (isExpand) { setMaxLines(lines + 1); } else setMaxLines(MAX); expandablestatus = isExpand; } public boolean getExpandablestatus() { return expandablestatus; } }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-22 14:15:35

Android实现可收缩和扩展的TextView的相关文章

【ANDROID自定义控件】可扩展的TextView,ExpandableTextView与Scroller类的使用

package com.sahadev.sildingfinishlayout; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.Scroller; import android.wi

android动态布局之动态加入TextView和ListView的方法

  本文实例讲述了android动态布局之动态加入TextView和ListView的方法.分享给大家供大家参考.具体实现方法如下: ? 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 57 58 59 60 61 62 63 6

android 代码中怎么判断一个TextView有多少行?

问题描述 android 代码中怎么判断一个TextView有多少行? android 代码中怎么判断一个TextView有多少行? 解决方案 android.text.Layout包含此信息和更多final int lineCount = textView.getLayout().getLineCount(); 解决方案二: android.text.Layout包含此信息和更多final int lineCount = textView.getLayout().getLineCount();

android动态布局之动态加入TextView和ListView的方法_Android

本文实例讲述了android动态布局之动态加入TextView和ListView的方法.分享给大家供大家参考.具体实现方法如下: package org.guoshi; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.guoshi.adapter.ImageAndTextAdapter; import android.app.

Android仿淘宝头条基于TextView实现上下滚动通知效果

最近有个项目需要实现通知栏的上下滚动效果,仿淘宝头条的那种. 我从网上看了一些代码,把完整的效果做了出来.如图所示: 具体代码片段如下: 1.在res文件夹下新建anmin文件夹,在这个文件夹里创建两个文件 (1).anim_marquee_in.xml进入时动画 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/ap

Android 实现不同字体颜色的TextView实现代码

Android 实现不同字体颜色的TextView 遇到的需求,mark一下. 实现代码: package com.chuck.recyclerviewdemo; import android.content.Context; import android.graphics.Canvas; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.Foreg

android layout-在android中怎么扩展view?

问题描述 在android中怎么扩展view? base.xml视图: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:lay

Android学习笔记(17):文本框TextView类

TextView继承自View,用于显示文本.它有许多的子类,掌握其属性是很重要的.   TextView支持的XML属性及相关方法 XML属性 相关方法 说明 android:autoLink setAutoLinkMask(int) 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/phone/map/all) android:autoText setKeyListener(KeyListener) 如果设置,将自动执行

Android UI设计系列之自定义TextView属性实现带下划线的文本框(4)_Android

在Android开发过程中,如果Android系统自带的属性不能满足我们日常开发的需求,那么就需要我们给系统控件添加额外的属性了.假如有个需求是实现带下划线的文本显示(下划线),如果不使用自定义属性的话实现起来也不太难(起码我认为的实现方式是有许多种的),今天就讲解一下如何使用自定义属性来实现上述带下划线的文本框吧.还好Android中自定义属性不是很复杂,也可以归纳为三步走吧. 老规矩,还是先贴出工程目录吧: 一.添加属性文件 在values文件夹中新建attrs.xml文件,在文件中新建属性