首页 > 代码库 > Android自动折行TextView Group
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 @Override119 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 @Override160 public void onClick(View view) {161 if (mHotwordsOnclickListener != null) {162 mHotwordsOnclickListener.hotwordOnclick((TextView) view);163 }164 }165 }
Android自动折行TextView Group
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。