• Android自动折行TextView Group


      1 package com.test.testview;
      2 
      3 import java.util.ArrayList;
      4 
      5 import android.content.Context;
      6 import android.graphics.Color;
      7 import android.text.TextUtils;
      8 import android.util.AttributeSet;
      9 import android.view.View;
     10 import android.widget.LinearLayout;
     11 import android.widget.TextView;
     12 
     13 import com.test.testview.R;
     14 
     15 public class HotwordsViewgroup extends LinearLayout implements
     16         View.OnClickListener
     17 {
     18     private final static int VIEW_MARGIN_HORIZONTAL = 50;
     19     private final static int VIEW_MARGIN_VERTICAL = 20;
     20 
     21     private HotwordsOnclickListener mHotwordsOnclickListener;
     22 
     23     public static interface HotwordsOnclickListener
     24     {
     25         /**
     26          * 触发onclik回调,根据TextView.getText去做相关事情
     27          * 
     28          * @param view
     29          */
     30         public void hotwordOnclick(TextView view);
     31     }
     32 
     33     public HotwordsViewgroup(Context context, AttributeSet attrs)
     34     {
     35         super(context, attrs);
     36         init();
     37     }
     38 
     39     public HotwordsViewgroup(Context context, AttributeSet attrs, int defStyle)
     40     {
     41         super(context, attrs, defStyle);
     42         init();
     43     }
     44 
     45     public HotwordsViewgroup(Context context)
     46     {
     47         super(context);
     48         init();
     49     }
     50 
     51     /**
     52      * 设置每个关键词点击事件监听
     53      * 
     54      * @param listener
     55      */
     56     public void setHotwordOnclickListener(HotwordsOnclickListener listener) {
     57         mHotwordsOnclickListener = listener;
     58     }
     59 
     60     private void init() {
     61         setOrientation(HORIZONTAL);
     62     }
     63 
     64     public void setData(final ArrayList<String> list) {
     65         removeAllViews();
     66         if (list != null) {
     67             for (int i = 0; i < list.size(); i++) {
     68                 String content = list.get(i);
     69                 if (TextUtils.isEmpty(content)) {
     70                     continue;
     71                 }
     72                 TextView textview = new TextView(getContext());
     73                 textview.setTextColor(Color.WHITE);
     74                 textview.setBackgroundResource(R.drawable.hot_words_bg);
     75                 textview.setTextSize(18);
     76                 textview.setOnClickListener(this);
     77                 textview.setMinimumWidth(100);
     78                 textview.setSingleLine();
     79                 textview.setEllipsize(TextUtils.TruncateAt.END);
     80                 textview.setText(content);
     81                 LinearLayout.LayoutParams layoutparams = new LinearLayout.LayoutParams(
     82                         LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
     83                 addView(textview, layoutparams);
     84             }
     85         }
     86     }
     87 
     88     /**
     89      * 重写onLayout,在layout每个元素之前,需要计算该元素是否需要折行到下一行显示
     90      */
     91     protected void onLayout(boolean changed, int l, int t, int r, int b) {
     92         int count = getChildCount();
     93         if (count == 0) {
     94             super.onLayout(changed, l, count, r, b);
     95             return;
     96         }
     97         int lengthX = 0;
     98         int lengthY = 0;
     99         for (int i = 0; i < count; i++) {
    100             View child = getChildAt(i);
    101             int width = child.getMeasuredWidth();
    102             int height = child.getMeasuredHeight();
    103             child.layout(lengthX, lengthY, lengthX + width, lengthY + height);
    104             int right = lengthX + width + VIEW_MARGIN_HORIZONTAL;
    105             int nextWidth = 0;
    106             if (i < count - 1) {
    107                 nextWidth = getChildAt(i + 1).getMeasuredWidth();
    108             }
    109             if (right + nextWidth > (r - l)) {
    110                 lengthX = 0;
    111                 lengthY += height + VIEW_MARGIN_VERTICAL;
    112             } else {
    113                 lengthX = right;
    114             }
    115         }
    116     }
    117 
    118     @Override
    119     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    120         int count = getChildCount();
    121         if (count == 0) {
    122             super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    123             return;
    124         }
    125         int lengthX = 0;
    126         int lengthY = 0;
    127         int r = MeasureSpec.getSize(widthMeasureSpec);
    128         // 定义子View的宽度最大不能超过r宽度
    129         int childWidth = MeasureSpec.makeMeasureSpec(r, MeasureSpec.AT_MOST);
    130         for (int i = 0; i < getChildCount(); i++) {
    131             View child = getChildAt(i);
    132             child.measure(childWidth, MeasureSpec.UNSPECIFIED);
    133             int width = child.getMeasuredWidth();
    134             int height = child.getMeasuredHeight();
    135             int right = lengthX + width + VIEW_MARGIN_HORIZONTAL;
    136             int nextWidth = 0;
    137             // 非最后一个元素需要尝试计算一下能否放的下
    138             if (i < count - 1) {
    139                 nextWidth = getChildAt(i + 1).getMeasuredWidth();
    140             } else {
    141                 // 最后一个计算高度的时候要加最后一排的高度
    142                 lengthY += height;
    143             }
    144             if (right + nextWidth > r) {
    145                 // 如果放不下,换行
    146                 lengthX = 0;
    147                 lengthY += height + VIEW_MARGIN_VERTICAL;
    148             } else {
    149                 // 如果能放下,往后加
    150                 lengthX = right;
    151             }
    152         }
    153         setMeasuredDimension(
    154                 widthMeasureSpec,
    155                 MeasureSpec.makeMeasureSpec(lengthY,
    156                         MeasureSpec.getMode(heightMeasureSpec)));
    157     }
    158 
    159     @Override
    160     public void onClick(View view) {
    161         if (mHotwordsOnclickListener != null) {
    162             mHotwordsOnclickListener.hotwordOnclick((TextView) view);
    163         }
    164     }
    165 }
  • 相关阅读:
    Python Day 24 类属性与对象属性、初始化方法init、绑定方法与非绑定方法、OOP三大特性之继承、抽象与继承、存在继承关系后的属性查找、派生与覆盖、子类中重用父类的方法
    Python Day 23 xml模块 、面向对象
    Python Day 22 configparser模块、subprocess模块、xlrd模块、xlwt模块
    LeetCode 两个数之和
    python ATM + 购物车
    python Day 19 random、json、pickle、hashlib、hmac、shutil、shelve
    Python Day 18 time模块、datetime模块、os模块、os.path模块
    解释型语言和编译型语言的区别
    GCC和G++区别
    安装python+setuptools+pip+nltk
  • 原文地址:https://www.cnblogs.com/lchd/p/4218605.html
Copyright © 2020-2023  润新知