上一篇有BUG,特意再來一個android
一、 建立佈局 collapsible_textview_layout.xmlide
佈局能夠本身修改樣式佈局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dip"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="left" android:gravity="left" android:orientation="horizontal"> <TextView android:id="@+id/desc_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:lineSpacingExtra="3dp" android:text="asdasd" android:textColor="#4A4A4A" android:textSize="12sp" /> </LinearLayout> <LinearLayout android:id="@+id/desc_op_ll" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" > <TextView android:id="@+id/desc_op_iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="展開" /> </LinearLayout> </LinearLayout>
二、佈局建立完成,接下來開始編寫自定義控件。首先在構造方法中獲取須要的佈局。post
public class CollapsibleTextView extends LinearLayout implements View.OnClickListener{ //規定文本最大行數 private int TEXT_MAX_LINE = 3; //是否可摺疊 private boolean IS_COLLAPSIBLE; //是否已經摺疊 private boolean COLLAPSIBLE; //第一次啓動進入onLayout方法標記 private boolean flag; //下拉箭頭佈局 private LinearLayout llDescOp; //下拉箭頭 private TextView ivDescOp; //文本內容 private TextView tvDesc; //監聽下拉箭頭的點擊事件了,經過判斷文本框的狀態作出相應的反應 class InnerRunnable implements Runnable{ @Override public void run() { if(IS_COLLAPSIBLE && COLLAPSIBLE){ //可摺疊而且已經摺疊--文本展開 tvDesc.setMaxLines(Integer.MAX_VALUE); // ivDescOp.setImageResource(R.mipmap.ic_launcher_round); ivDescOp.setText("收回"); COLLAPSIBLE = false; flag = true; }else if(IS_COLLAPSIBLE && !COLLAPSIBLE){ //可摺疊但未進行摺疊--文本摺疊 tvDesc.setMaxLines(TEXT_MAX_LINE); // ivDescOp.setImageResource(R.mipmap.ic_launcher); ivDescOp.setText("展開"); COLLAPSIBLE = true; flag = true; } } } public CollapsibleTextView(Context context, AttributeSet attrs) { super(context, attrs); //獲取view的佈局 View view = inflate(context, R.layout.collapsible_textview_layout,this); tvDesc = (TextView) view.findViewById(R.id.desc_tv); llDescOp = (LinearLayout) view.findViewById(R.id.desc_op_ll); ivDescOp = (TextView) findViewById(R.id.desc_op_iv); llDescOp.setOnClickListener(this); } public CollapsibleTextView(Context context) { super(context); } //設置文本的內容方法,讓調用者使用。 public void setText(String text){ tvDesc.setText(text); requestLayout(); } //獲取的佈局添加到控件上 @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); //初始化代碼 //flag用來標記後續操做不走如下代碼 if(!flag){ //文本的行數大於規定值,摺疊並顯示下拉箭頭 if(tvDesc.getLineCount() > TEXT_MAX_LINE){ tvDesc.setMaxLines(TEXT_MAX_LINE); llDescOp.setVisibility(VISIBLE); IS_COLLAPSIBLE = true; COLLAPSIBLE = true; }else{ llDescOp.setVisibility(GONE); IS_COLLAPSIBLE = false; } } } @Override public void onClick(View view) { post(new InnerRunnable()); } }
三、在咱們的佈局activity_main中引用此控件。注意格式,寫全控件的路徑。this
<com.guorentong.learn.textviewzhedie.CollapsibleTextView android:id="@+id/CollapsibleTextView" android:layout_width="match_parent" android:layout_height="wrap_content"> </com.guorentong.learn.textviewzhedie.CollapsibleTextView>
四、代碼調用 設置3d
collapsibleTextView = (CollapsibleTextView) findViewById(R.id.CollapsibleTextView); //設置文字會出現效果 collapsibleTextView.setText("文本");