标签:
本示例实现微信朋友圈发布动态后呈现的全文和收起功能。
1,自定义TextView的布局文件——my_text_view.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <!-- 自定义TextView,实现自动的添加全文和收起功能 --> 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 android:orientation="vertical" 5 android:layout_width="match_parent" 6 android:layout_margin="10dp" 7 android:layout_height="wrap_content"> 8 <!-- 显示文本TextView --> 9 <TextView android:layout_width="match_parent" 10 android:id="@+id/contentTextView" 11 style="@style/text" 12 android:textColor="#363636" 13 android:lineSpacingMultiplier="1.2" 14 android:textScaleX="1.0" 15 android:background="@drawable/selector_content_text_view" 16 android:text="@string/contentText" 17 android:layout_height="wrap_content"/> 18 <!-- 显示文本TextView结束 --> 19 <!-- 全文(收起)TextView --> 20 <TextView android:layout_width="wrap_content" 21 android:id="@+id/tipTextView" 22 android:layout_marginTop="5dp" 23 style="@style/text" 24 android:textColor="#596d96" 25 android:layout_height="wrap_content"/> 26 <!-- 全文(收起)TextView结束 --> 27 </LinearLayout>
2,自定义TextView的自定义属性——attrs.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 <declare-styleable name="my_text_view"> 4 <attr name="contentText" format="string"></attr> 5 </declare-styleable> 6 </resources>
3,自定义TextView的实现——MyTextView.java
1 package com.example.SelfTextView; 2 3 import android.content.Context; 4 import android.content.res.TypedArray; 5 import android.util.AttributeSet; 6 import android.util.Log; 7 import android.view.LayoutInflater; 8 import android.view.View; 9 import android.widget.LinearLayout; 10 import android.widget.TextView; 11 import android.widget.Toast; 12 13 /** 14 * Created by Administrator on 2015/4/15 0015. 15 */ 16 public class MyTextView extends LinearLayout { 17 String tag="MyTextView"; 18 TextView contentTextView; 19 int initLines=6; 20 boolean PICK_UP=true; 21 boolean SEE_ALL=false; 22 TextView tipTextView; 23 String contentText; 24 Context context; 25 int lineNum; 26 OnClickListener contentTextViewOnClickListener; 27 OnClickListener tipTextViewOnClickListener; 28 boolean flag=SEE_ALL; 29 30 public MyTextView(Context context, AttributeSet attrs) { 31 super(context, attrs); 32 this.context=context; 33 View view= LayoutInflater.from(context).inflate(R.layout.my_text_view,this); 34 contentTextView= (TextView) view.findViewById(R.id.contentTextView); 35 tipTextView= (TextView) view.findViewById(R.id.tipTextView); 36 TypedArray typedArray=context.obtainStyledAttributes(attrs,R.styleable.my_text_view); 37 contentText=typedArray.getString(R.styleable.my_text_view_contentText); 38 tipTextView.setOnClickListener(new OnClickListener() { 39 @Override 40 public void onClick(View view) { 41 tipTextViewOnClick(); 42 } 43 }); 44 initFlag(); 45 getLineNum(); 46 } 47 48 /** 在此实现对contentTextView的显示控制 */ 49 private void tipTextViewOnClick(){ 50 if(lineNum<=initLines){ 51 return; 52 } 53 if(SEE_ALL==flag){ 54 tipTextView.setText("收起"); 55 flag=PICK_UP; 56 // 点击全文 57 contentTextView.setMaxLines(lineNum); 58 }else if(PICK_UP==flag){ 59 tipTextView.setText("全文"); 60 flag=SEE_ALL; 61 // 点击收起 62 contentTextView.setMaxLines(initLines); 63 } 64 } 65 /** 初始化MyTextView */ 66 private void initMyTextView(){ 67 if(lineNum>initLines){ 68 if(tipTextView.getVisibility()!=VISIBLE){ 69 tipTextView.setVisibility(VISIBLE); 70 } 71 contentTextView.setMaxLines(initLines); 72 }else if(lineNum<=initLines){ 73 if(tipTextView.getVisibility()!=GONE){ 74 tipTextView.setVisibility(GONE); 75 } 76 77 } 78 } 79 /** 初始化flag */ 80 private void initFlag(){ 81 String content=tipTextView.getText().toString(); 82 if(!("全文".equals(content))){ 83 tipTextView.setText("全文"); 84 flag=SEE_ALL; 85 } 86 } 87 /** 获取contentTextView的最大行数 */ 88 private void getLineNum(){ 89 /** 新方法 */ 90 // lineNum=contentTextView.getHeight()/contentTextView.getLineHeight(); 91 // Log.d(tag,"lineNum = "+lineNum); 92 // initMyTextView(); 93 /** 新方法结束 */ 94 contentTextView.post(new Runnable() { 95 @Override 96 public void run() { 97 lineNum=contentTextView.getLineCount(); 98 Log.d(tag,"lineNum="+lineNum); 99 // lineNum=11; 100 initMyTextView(); 101 } 102 }); 103 } 104 public TextView getContentTextView() { 105 return contentTextView; 106 } 107 108 public TextView getTipTextView() { 109 return tipTextView; 110 } 111 112 public void setContentTextViewOnClickListener(OnClickListener contentTextViewOnClickListener) { 113 contentTextView.setOnClickListener(contentTextViewOnClickListener); 114 } 115 116 }
4,在主布局文件中使用MyTextView——main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:jack="http://schemas.android.com/apk/res/com.example.SelfTextView" 4 android:orientation="vertical" 5 android:background="#ffffff" 6 android:layout_width="fill_parent" 7 android:layout_height="fill_parent" 8 > 9 <com.example.SelfTextView.MyTextView android:layout_width="match_parent" 10 android:id="@+id/myTextView" 11 jack:contentText="@string/contentText" 12 android:layout_height="wrap_content"/> 13 </LinearLayout>
5,在Activity中使用MyTextView——MyActivity.java
1 package com.example.SelfTextView; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.widget.Toast; 7 8 public class MyActivity extends Activity { 9 /** 10 * Called when the activity is first created. 11 */ 12 MyTextView myTextView; 13 @Override 14 public void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.main); 17 myTextView= (MyTextView) findViewById(R.id.myTextView); 18 myTextView.setContentTextViewOnClickListener(new View.OnClickListener() { 19 @Override 20 public void onClick(View view) { 21 Toast.makeText(MyActivity.this,"我是显示内容的",Toast.LENGTH_SHORT).show(); 22 } 23 }); 24 25 } 26 }
运行程序,就可实现当TextView的行数大于所设定的阈值时,则自动显示出全文触控点,同时TextView的显示内容行数依然是阈值行数。当点击全文后,则TextView的全部行数全部展示,同时全文触控点改变为收起。当然,如果TextView的行数小于等于所设定的阈值,则触控点就不会显示。这样的TextView是不是有些智能了。当然,你还可以添加更多的功能,比如实现emoji表情的显示,长点击是弹出删除,收藏,等功能的对话框。下一篇,我会不止实现这些功能,欢迎期待。
标签:
原文地址:http://www.cnblogs.com/jackyang2015/p/4439570.html