码迷,mamicode.com
首页 > 微信 > 详细

自定义TextView实现微信动态的全文和收起功能

时间:2015-04-19 19:29:49      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:

本示例实现微信朋友圈发布动态后呈现的全文和收起功能。

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>
my_text_view

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>
attrs.xml

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 }
MyTextView.java

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>
main.xml

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 }
MyActivity.java

运行程序,就可实现当TextView的行数大于所设定的阈值时,则自动显示出全文触控点,同时TextView的显示内容行数依然是阈值行数。当点击全文后,则TextView的全部行数全部展示,同时全文触控点改变为收起。当然,如果TextView的行数小于等于所设定的阈值,则触控点就不会显示。这样的TextView是不是有些智能了。当然,你还可以添加更多的功能,比如实现emoji表情的显示,长点击是弹出删除,收藏,等功能的对话框。下一篇,我会不止实现这些功能,欢迎期待。

 

自定义TextView实现微信动态的全文和收起功能

标签:

原文地址:http://www.cnblogs.com/jackyang2015/p/4439570.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!