Android TextView 显示部分文本,实现 全文/展开 和 收起功能

本文链接: https://blog.csdn.net/xietansheng/article/details/87799586

文本的展开收起功能,类似微信朋友圈中的文本内容显示。如果文本超过指定的行数,后面的文本隐藏,显示一个“全文”按钮,点击“全文”按钮展开全部文本。展开全部文本后显示“收起”按钮,点“收起”按钮恢复初始的折叠状态。

1. 实现原理

关键的方法是获取文本内容在 TextView 控件中显示所需要的行数(textView.getLineCount()),关键代码如下:

// 先设置最大行数为最大, 使全部文本内容都能显示出来
textView.setMaxLines(Integer.MAX_VALUE);// 设置文本内容
textView.setText(text);/** 设置完文本内容后, 获取该文本内容在 textView 上全部显示所需要的行数,* PS: 该方法必须要等文本控件的宽度有值时(布局完成后)才能计算文本行数。*/
int lineCount = textView.getLineCount();if (lineCount > maxLine) {// 如果文本全部显示所需要的行数超过指定的行数, // 则限制控件只显示指定的行数, 并显示 "全文" 按钮textView.setMaxLines(maxLine);expansionButton.setVisibility(VISIBLE);expansionButton.setText("全文");
} else {// 行数没有超过限制, 不需要显示 "全文/收起" 按钮expansionButton.setVisibility(GONE);
}....../** 当前需要显示 "全文/收起" 按钮时, 点击按钮后切换状态*/
if (isExpansion) {expansionButton.setText("收起");             // 全文状态, 按钮显示 "收起"textView.setMaxLines(Integer.MAX_VALUE);    // 全文状态, 行数设置为最大
} else {expansionButton.setText("全文");             // 收起状态, 按钮显示 "全文"contentTextView.setMaxLines(mMaxLine);      // 收起状态, 最大显示指定的行数
}

2. 代码实例:可展开的文本控件封装

封装一个支持文本展开和收起完整功能的自定义控件 ExpandableTextView

2.1 控件的封装

颜色资源:res/values/colors.xml


<resources><color name="bg_text_press">#FFE4E4E4color>
resources>

全文/收起 按钮背景:res/drawable/sel_text_touch.xml


<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true" android:drawable="@color/bg_text_press"/><item android:drawable="@android:color/transparent"/>
selector>

自定义控件的布局文件:res/layout/view_expandable.xml


<merge xmlns:android="http://schemas.android.com/apk/res/android"><TextViewandroid:id="@+id/tv_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:lineSpacingExtra="3dp"android:textSize="16sp"android:textColor="#FF3C3C3C"android:text=""/><TextViewandroid:id="@+id/v_expansion"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="2dp"android:paddingTop="3dp"android:paddingBottom="3dp"android:background="@drawable/sel_text_touch"android:clickable="true"android:focusable="true"android:textSize="16sp"android:textColor="#FF576B95"android:text="全文"/>merge>

支持文本展开/收起的自定义控件: ExpandableTextView.java

package com.xiets.demo;import android.content.Context;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.LinearLayout;
import android.widget.TextView;/*** 可展开/收起的文本控件*/
public class ExpandableTextView extends LinearLayout {/** 显示内容的文本控件 */private TextView mContentTextView;/** 全文/收起 按钮 */private TextView mExpansionButton;/** 最大显示行数(默认 6 行) */private int mMaxLine = 6;/** 显示的内容 */private CharSequence mContent;/** 当前是否已是 "全文" 状态 */private boolean mIsExpansion;public ExpandableTextView(Context context) {super(context);init(context, null);}public ExpandableTextView(Context context, AttributeSet attrs) {super(context, attrs);init(context, attrs);}public ExpandableTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context, attrs);}private void init(Context context, AttributeSet attrs) {setOrientation(VERTICAL);LayoutInflater.from(context).inflate(R.layout.view_expandable, this);mContentTextView = findViewById(R.id.tv_content);mExpansionButton = findViewById(R.id.v_expansion);// 监听文本控件的布局绘制mContentTextView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {if (mContentTextView.getWidth() == 0) {return;}mContentTextView.getViewTreeObserver().removeOnGlobalLayoutListener(this);// 文本控件绘制成功后, 更新文本setText(mContent);}});// "全文/收起" 按钮点击监听mExpansionButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {toggleExpansionStatus();}});// 默认隐藏 "全文/收起" 按钮mExpansionButton.setVisibility(GONE);}/*** 切换 全文/收起 状态*/private void toggleExpansionStatus() {// 切换状态mIsExpansion = !mIsExpansion;// 更新内容和切换按钮的显示if (mIsExpansion) {mExpansionButton.setText("收起");                       // 全文状态, 按钮显示 "收起"mContentTextView.setMaxLines(Integer.MAX_VALUE);        // 全文状态, 行数设置为最大} else {mExpansionButton.setText("全文");                       // 收起状态, 按钮显示 "全文"mContentTextView.setMaxLines(mMaxLine);                 // 收起状态, 最大显示指定的行数}}/*** 设置收起状态最大允许显示的行数(超过该行数显示 "收起" 按钮)*/public void setMaxLine(int maxLine) {this.mMaxLine = maxLine;setText(mContent);                                      // 更新状态, 重新显示文本}/*** 设置需要显示的文本*/public void setText(CharSequence text) {mContent = text;// 文本控件有宽度时(绘制成功后)才能获取到文本显示的所需要的行数,// 如果控件还没有被绘制, 等监听到绘制成功后再设置文本if (mContentTextView.getWidth() == 0) {return;}mContentTextView.setMaxLines(Integer.MAX_VALUE);        // 默认先设置最大行数为最大值(即不限制行数)mContentTextView.setText(mContent);                     // 设置文本int lineCount = mContentTextView.getLineCount();        // 设置完文本后, 获取显示该文本所需要的行数if (lineCount > mMaxLine) {// 行数超过显示, 显示 "全文" 按钮mExpansionButton.setVisibility(VISIBLE);mExpansionButton.setText("全文");mContentTextView.setMaxLines(mMaxLine);             // 设置文本控件的最大允许显示行数mIsExpansion = false;} else {// 行数没有超过限制, 不需要显示 "全文/收起" 按钮mExpansionButton.setVisibility(GONE);}}}

2.2 控件的使用

MainActivity 布局文件:res/layout/activity_main.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.xiets.demo.ExpandableTextViewandroid:id="@+id/tv_text"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="20dp"/>LinearLayout>

MainActivity:MainActivity.java

package com.xiets.demo;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ExpandableTextView textView = findViewById(R.id.tv_text);textView.setText("        Java是一门面向对象编程语言,不仅吸收了" +"C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念," +"因此Java语言具有功能强大和简单易用两个特征。\n" +"        Java语言作为静态面向对象编程语言的代表," +"极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。\n" +"        Java具有简单性、面向对象、分布式、健壮性、安全性、" +"平台独立与可移植性、多线程、动态性等特点 。\n" +"        Java可以编写桌面应用程序、Web应用程序、分布式系统和" +"嵌入式系统应用程序等。");}}

结果展示:

result.gif



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部