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 }
时间: 2024-11-13 08:48:08

Android自动折行TextView Group的相关文章

自适应高度 UILabel自动折行

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 100, 300, 50)]; label.text = @"今天下午全市多云到阴有阵雨或雷雨,今天夜里到明天阴有阵雨,雨量可达大雨. 东北风5-6级阵风7级,逐渐增强到6-7级阵风8级. 今天最高气温:26左右, 明晨最低气温:22左右. 今晨最低气温:21. 今日紫外线等级:2级,照射强度弱,适当防护. 明日洗车指数:4级,天气有雨,不宜洗车."; //清空

UIlabel多行文字自动换行 (自动折行)

UIView *footerView = [[UIView alloc]initWithFrame:CGRectMake(10, 100, 300, 180)]; UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 100, 300, 150)]; label.text = @"Hello world! Hello world!Hello world! Hello world! Hello world! Hello worl

div 纯数字很长时无法折行解决

<div style="width:100%;word-wrap:break-word;word-spacing:normal;"> 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 </div> 加上红色部分属性数字满一行时,会自动折行

浏览器对中文标点符号折行的处理差异

网站前台有时候遇到的麻烦很奇怪,前段时间,我遇到了一个问题:chrome下读取中文标点符号时版块错位,而其他浏览器正常. 这是因为各个浏览器对中文标点符号折行的处理有差异. 问题描述 制作中文页面并使用标点符号时,不同浏览器对于中文标点的折行判定条件有差异. 造成的影响 由于不同浏览器对于中文标点的折行条件有差异,若在对段落文字进行排版布局时,过分依赖当前段落文字自动计算的尺寸可能会产生折行差异,最终可能导致文字布局存在少许差异. 问题分析 1. 中文标点书写规范标点符号是辅助文字记录语言的符号

[原] Android自动打包之命令行打包

Android自动打包流程详细图: 总结为以下几个步骤: 1. 生成R文件 2. Java代码编译成class文件 3. class文件生成dex文件 4. 打包资源 5. 生成apk 6. 创建密匙 7. 签名apk 下面用Ubuntu命令行来打包,流程如下: 1. 生成R文件,命令如下: aapt package -f -m -J $BUILD_SOURCE_PATH/$ANDROID_GEN \ -A $BUILD_SOURCE_PATH/$PACKAGE_RESOURCE_FILE \

自动滚动的Textview

又到了写博博的时候了!大家还好吧! 开始做机顶盒了,所以这里就有很多的界面需要做成一个自动化的界面.因为遥控盒手机触摸毕竟不一样咯!这里而且要方便大众的视觉体验的话,我们必须要考虑到这些因素.当然,我觉着,这次的自动滚动效果一定对大家也很有帮助的哦! 我们只要写一个类来继承我布局文件里面写的一个TextView就ok啦. package com.example.myscroltextview.view; import java.util.ArrayList; import android.con

Android 自动生成的R类

来自:http://android.tgbus.com/Android/tutorial/201105/353458.shtml Android 自动生成的R类 资源文件的使用分为在代码中使用和在其他资源文件中引用该资源文件.在我们编译一个Android应用时,Android会自动生成一个R类,在该类中根据不同的资源类型又生成了相应的内部类,该类包含了系统中使用到的所有资源文件的标示,其内容如下所示. Java代码:package eoe.demo; // 资源类 public final cl

Android界面(1) 使用TextView实现跑马灯效果

方法一:(只能实现单个TextView的跑马灯效果)在TextView添加以下控件 android:singleLine="true"只能单行,超出的文字显示为"..." android:ellipsize="marquee"省略号没有,但没有跑马灯效果 android:focusable="true" android:focusableInTouchMode="true" 方法二:(可以实现多行TextV

android自动打包方法(ant+proguard+签名)

前段时间做了一个android的网游项目,现在优化减少体积和防止别人反编译,需要把编译后.class进行混淆,开始在网上看了一些关于 ProGuard的介绍,基本上都是使用ADT自带的打包方式,那个打包方式太慢了,还要手工输密码,一个字烦. 于是开始寻找ant+proguard+签名的打包方式,遗憾的是资料不是缺手就是断脚. 好吧,看来得食自己了,!@#¥@#!@#!@##¥@#¥!@#@ 转眼一周,我++,终于把东西搞出来 ps:我们项目还有一个特殊需求,要把版本号,推广ID打到包里去,方便做