package com.test.testview;

 import java.util.ArrayList;

 import android.content.Context;
import android.graphics.Color;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView; import com.test.testview.R; public class HotwordsViewgroup extends LinearLayout implements
View.OnClickListener
{
private final static int VIEW_MARGIN_HORIZONTAL = 50;
private final static int VIEW_MARGIN_VERTICAL = 20; private HotwordsOnclickListener mHotwordsOnclickListener; public static interface HotwordsOnclickListener
{
/**
* 触发onclik回调,根据TextView.getText去做相关事情
*
* @param view
*/
public void hotwordOnclick(TextView view);
} public HotwordsViewgroup(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
} public HotwordsViewgroup(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
} public HotwordsViewgroup(Context context)
{
super(context);
init();
} /**
* 设置每个关键词点击事件监听
*
* @param listener
*/
public void setHotwordOnclickListener(HotwordsOnclickListener listener) {
mHotwordsOnclickListener = listener;
} private void init() {
setOrientation(HORIZONTAL);
} public void setData(final ArrayList<String> list) {
removeAllViews();
if (list != null) {
for (int i = 0; i < list.size(); i++) {
String content = list.get(i);
if (TextUtils.isEmpty(content)) {
continue;
}
TextView textview = new TextView(getContext());
textview.setTextColor(Color.WHITE);
textview.setBackgroundResource(R.drawable.hot_words_bg);
textview.setTextSize(18);
textview.setOnClickListener(this);
textview.setMinimumWidth(100);
textview.setSingleLine();
textview.setEllipsize(TextUtils.TruncateAt.END);
textview.setText(content);
LinearLayout.LayoutParams layoutparams = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
addView(textview, layoutparams);
}
}
} /**
* 重写onLayout,在layout每个元素之前,需要计算该元素是否需要折行到下一行显示
*/
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int count = getChildCount();
if (count == 0) {
super.onLayout(changed, l, count, r, b);
return;
}
int lengthX = 0;
int lengthY = 0;
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
int width = child.getMeasuredWidth();
int height = child.getMeasuredHeight();
child.layout(lengthX, lengthY, lengthX + width, lengthY + height);
int right = lengthX + width + VIEW_MARGIN_HORIZONTAL;
int nextWidth = 0;
if (i < count - 1) {
nextWidth = getChildAt(i + 1).getMeasuredWidth();
}
if (right + nextWidth > (r - l)) {
lengthX = 0;
lengthY += height + VIEW_MARGIN_VERTICAL;
} else {
lengthX = right;
}
}
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int count = getChildCount();
if (count == 0) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
}
int lengthX = 0;
int lengthY = 0;
int r = MeasureSpec.getSize(widthMeasureSpec);
// 定义子View的宽度最大不能超过r宽度
int childWidth = MeasureSpec.makeMeasureSpec(r, MeasureSpec.AT_MOST);
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.measure(childWidth, MeasureSpec.UNSPECIFIED);
int width = child.getMeasuredWidth();
int height = child.getMeasuredHeight();
int right = lengthX + width + VIEW_MARGIN_HORIZONTAL;
int nextWidth = 0;
// 非最后一个元素需要尝试计算一下能否放的下
if (i < count - 1) {
nextWidth = getChildAt(i + 1).getMeasuredWidth();
} else {
// 最后一个计算高度的时候要加最后一排的高度
lengthY += height;
}
if (right + nextWidth > r) {
// 如果放不下,换行
lengthX = 0;
lengthY += height + VIEW_MARGIN_VERTICAL;
} else {
// 如果能放下,往后加
lengthX = right;
}
}
setMeasuredDimension(
widthMeasureSpec,
MeasureSpec.makeMeasureSpec(lengthY,
MeasureSpec.getMode(heightMeasureSpec)));
} @Override
public void onClick(View view) {
if (mHotwordsOnclickListener != null) {
mHotwordsOnclickListener.hotwordOnclick((TextView) view);
}
}
}

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

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

    UIView *footerView = [[UIView alloc]initWithFrame:CGRectMake(, , , )]; UILabel *label = [[UILabel al ...

  2. emacs自动折行设置

    - emacs自动折行     - 临时设置下 M-x `toggle-truncate-lines`    - init.el 中添加 `(toggle-truncate-lines 1)`

  3. CSS3设置内容超过一定长度后自动折行

    在用编辑器保存的数据到数据库的时候经常是在我们的内容前后加一个P标签,但是出来之后是一行,有时候会超过边框的宽度,所以研究了如何折行,如下代码: <!DOCTYPE html> <h ...

  4. Bootstrap table 元素列内容超长自动折行显示方法?

    共需要四步: 1.在table元素的父容器div加上:class="table-responsive" 3.设置表头th的width:<th width="20%& ...

  5. table中td 内容超长 自动折行 (含字母数字文字)

    <table style="width:100%;table-layout:fixed;"> //列宽由表格宽度和列宽度设定 <thead> <th& ...

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

    <div style="width:100%;word-wrap:break-word;word-spacing:normal;"> </div> 加上红色 ...

  7. UILabel折行问题 从文件输入文本

    当内存的字符串对象中有\n时,该字符串会在UILabel展示时进行折行. 如果字符串是从plist中拿到的 1,字符串在plist中输入时打入过回车(即字符串在plist中展示也是折行的),那么字符串 ...

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

    Android自动打包流程详细图: 总结为以下几个步骤: 1. 生成R文件 2. Java代码编译成class文件 3. class文件生成dex文件 4. 打包资源 5. 生成apk 6. 创建密匙 ...

  9. [修正] Firemonkey 中英文混排折行问题(移动平台)

    问题:FMX 在移动平台的文字显示并非由该平台的原生 API 来显示,而是由 FMX.TextLayout.GPU 来处理,也许是官方没留意到中文字符的问题,造成在中英文混排折行时,有些问题. 适用: ...

随机推荐

  1. 报错:java.lang.IllegalStateException

    java.lang.IllegalStateException: BeanFactory not initialized or already closed - call '“refresh”' be ...

  2. foj Problem 2275 Game

    Problem D Game Accept: 145    Submit: 844Time Limit: 1000 mSec    Memory Limit : 262144 KB Problem D ...

  3. 解决使用webbrowser请求url时数据传递丢失问题

    问题: 使用“ this.webBrowser.Url = new Uri(webBrowserUrl);”方式请求Action(Java Web)并传递数据,在webBrowserUrl中携带的参数 ...

  4. 用promise做图片的预加载

    var url='jsonp-master/0.jpg' var url1='jsonp-master/1.jpg' var url2='jsonp-master/2.jpg' var img=doc ...

  5. 27深入理解C指针之---字符串基础

    一.字符串:是以ASCII字符NUL结尾的字符序列,NUL表示为\0 1.定义:将字符按顺序存储在数组中,以NUL结尾. 2.特征: 1).每个字符串长度只是包含所有的字符,不包括最后的NUL,手动分 ...

  6. react-highcharts

    import ReactHighcharts from'react-highcharts'; class SummaryLeft extends Component { render () {var ...

  7. Image与Base64String的互转换

    public Image Base64ToImage(string base64String) { // Convert Base64 String to byte[] byte[] imageByt ...

  8. win10下Vmware12虚拟机安装Ubuntu16.04

    一.下载VMware虚拟机: VMware12下载地址:点这里 VMware 12pro 专业版永久许可证密钥:  5A02H-AU243-TZJ49-GTC7K-3C61N 如果许可证不能用,参考这 ...

  9. lms111,rplidar 方向和起始角

    上图中,从X反方向是开始,按顺时针方向增加,实际运转方向也为顺时针方向. lms111:正放时:数据按逆时针依次输出.(起始----->结束) 北阳:正放时:数据按逆时针依次输出

  10. Ubuntu 16.04安装Wine版的迅雷+QQ(完美方案,终极解决方法)

    安装前先备份好系统! 继上一篇安装QQ的方法http://www.cnblogs.com/EasonJim/p/7425978.html,这一篇的QQ采用的是Wine模式安装.完美解决消息记录中文乱码 ...