Android TextView限定行数最大值,点击按钮显示所有内容

问题描述

Android TextView限定行数最大值,点击按钮显示所有内容


展开

Android TextView限定行数最大值,点击按钮显示所有内容


代码


xml布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.eventbusdemo.MainActivity$PlaceholderFragment" >


    
    <TextView 
        android:id="@+id/activity_textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_toLeftOf="@+id/activity_imageview"
        android:maxLines="3"
        android:gravity="center|left"/>
    
    <ImageView 
        android:id="@+id/activity_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:contentDescription="@null"
        android:background="@drawable/up"
        android:scaleType="fitCenter"/>
    
</RelativeLayout>



java 代码


package com.example.eventbusdemo;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;


public class TextViewActivity extends Activity{


private TextView textview;
private ImageView imageview;
private boolean   isimageview=false;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_textview);
textview=(TextView) findViewById(R.id.activity_textview);
imageview=(ImageView) findViewById(R.id.activity_imageview);
textview.setText("““我们不想看到以赛亚-托马斯受伤。向他这一个不可思议的赛季致敬,他今年所完成的事情,以及在他妹妹不幸去世的情况下,他在季后赛中所做的事情。但是,对于我们一个整体而言,我们面对的从来都不只是一个人。这不是我们关注的焦点。这一直都是团队的努力,以及我们如何能够拿出最好的比赛计划来对抗他们的球队。他们仍然很好地执行教练意图。他们仍然有一些球员会去迎接挑战,会站出来,所以我们必须为此做好准备。”我们不想看到以赛亚-托马斯受伤。向他这一个不可思议的赛季致敬,他今年所完成的事情,以及在他妹妹不幸去世的情况下,他在季后赛中所做的事情。但是,对于我们一个整体而言,我们面对的从来都不只是一个人。这不是我们关注的焦点。这一直都是团队的努力,以及我们如何能够拿出最好的比赛计划来对抗他们的球队。他们仍然很好地执行教练意图。他们仍然有一些球员会去迎接挑战,会站出来,所以我们必须为此做好准备。”“我们不想看到以赛亚-托马斯受伤。向他这一个不可思议的赛季致敬,他今年所完成的事情,以及在他妹妹不幸去世的情况下,他在季后赛中所做的事情。但是,对于我们一个整体而言,我们面对的从来都不只是一个人。这不是我们关注的焦点。这一直都是团队的努力,以及我们如何能够拿出最好的比赛计划来对抗他们的球队。他们仍然很好地执行教练意图。他们仍然有一些球员会去迎接挑战,会站出来,所以我们必须为此做好准备。”");

// textview.setText("你好啊啊啊");

textview.post(new Runnable() {

@Override
public void run() {
boolean b=isTextView();
Log.d("TextViewActivity", "b----:"+b);
if(b){
imageview.setVisibility(View.VISIBLE);
}else{
imageview.setVisibility(View.GONE);
}
}
});


imageview.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
if(!isimageview){
imageview.setBackgroundResource(R.drawable.down);
textview.setMaxLines(10000);

isimageview=true;
}else{
imageview.setBackgroundResource(R.drawable.up);
textview.setMaxLines(3);
isimageview=false;
}
}
});
}

private boolean isTextView(){ 
float m=textview.getPaint().measureText(textview.getText().toString());
float n=3*(textview.getWidth()-textview.getPaddingRight()-textview.getPaddingLeft());
return m>n; 
}

}


核心代码

private boolean isTextView(){ 
float m=textview.getPaint().measureText(textview.getText().toString());//重新测量textview宽度
float n=3*(textview.getWidth()-textview.getPaddingRight()-textview.getPaddingLeft());//textview 一行的宽度
return m>n; 
}


由于TextView渲染是需要时间的,如果在获取到TextView并setText之后立马进行判断,会发现此时TextView还没有绘制出来,拿到的属性均为初始值,比如前面函数中调用的getWidth返回为0,这样显然是不对的。

textview.post(new Runnable() {

@Override
public void run() {
boolean b=isTextView();
Log.d("TextViewActivity", "b----:"+b);
if(b){
imageview.setVisibility(View.VISIBLE);
}else{
imageview.setVisibility(View.GONE);
}
}
});