Android自动折行TextView Group
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的更多相关文章
- UIlabel多行文字自动换行 (自动折行)
UIView *footerView = [[UIView alloc]initWithFrame:CGRectMake(, , , )]; UILabel *label = [[UILabel al ...
- emacs自动折行设置
- emacs自动折行 - 临时设置下 M-x `toggle-truncate-lines` - init.el 中添加 `(toggle-truncate-lines 1)`
- CSS3设置内容超过一定长度后自动折行
在用编辑器保存的数据到数据库的时候经常是在我们的内容前后加一个P标签,但是出来之后是一行,有时候会超过边框的宽度,所以研究了如何折行,如下代码: <!DOCTYPE html> <h ...
- Bootstrap table 元素列内容超长自动折行显示方法?
共需要四步: 1.在table元素的父容器div加上:class="table-responsive" 3.设置表头th的width:<th width="20%& ...
- table中td 内容超长 自动折行 (含字母数字文字)
<table style="width:100%;table-layout:fixed;"> //列宽由表格宽度和列宽度设定 <thead> <th& ...
- div 纯数字很长时无法折行解决
<div style="width:100%;word-wrap:break-word;word-spacing:normal;"> </div> 加上红色 ...
- UILabel折行问题 从文件输入文本
当内存的字符串对象中有\n时,该字符串会在UILabel展示时进行折行. 如果字符串是从plist中拿到的 1,字符串在plist中输入时打入过回车(即字符串在plist中展示也是折行的),那么字符串 ...
- [原] Android自动打包之命令行打包
Android自动打包流程详细图: 总结为以下几个步骤: 1. 生成R文件 2. Java代码编译成class文件 3. class文件生成dex文件 4. 打包资源 5. 生成apk 6. 创建密匙 ...
- [修正] Firemonkey 中英文混排折行问题(移动平台)
问题:FMX 在移动平台的文字显示并非由该平台的原生 API 来显示,而是由 FMX.TextLayout.GPU 来处理,也许是官方没留意到中文字符的问题,造成在中英文混排折行时,有些问题. 适用: ...
随机推荐
- bzoj 4295 [PA2015]Hazard 贪心,暴力
[PA2015]Hazard Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 69 Solved: 19[Submit][Status][Discus ...
- DataSet的Merge方法合并两张表
原文发布时间为:2008-08-01 -- 来源于本人的百度文章 [由搬家工具导入] UniqueConstraint uc = new UniqueConstraint("pk" ...
- mybatis传入map参数,map中包含list(输入参数)
1.xml中配置: <!-- 根据条件查询满足条件的ID集合开始 --> <select id="getQuestionsIdsForExamPaper" res ...
- mfc对话框嵌入Flash的交互(转)
原文转自 http://blog.csdn.net/yacper/article/details/5021081 研究Flash嵌入游戏中的可行性....... 渲染问题已解决 事件响应已解决 下面是 ...
- CMake安装或CMake Error at CMakeLists
CMake安装或CMake Error at CMakeLists 发生情景: 使用cmake命令安装软件时,报如下错误: CMake Error at CMakeLists.txt:4 (CMAKE ...
- AC日记——【模板】线段树 2 洛谷 P3373
P3373 [模板]线段树 2387通过1.8K提交标签难度 提高+/省选- 提交 讨论 题解 最新讨论 更多讨论 2333最后三个点卡常数.迷之RE感觉这题很迷啊好像一共三组测试数据.友情提示:开l ...
- RabbitMQ 最常用的三大模式
目录 Direct 模式 Topic 模式 Fanout 模式 Direct 模式 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue. Direct ...
- mybatis-plus generator template 中的全部属性
{ "date": "2018-10-30", "superServiceImplClassPackage": "com.baom ...
- BZOJ2002弹飞绵羊
动态树LCT模板题 #include<cstdio> #include<cctype> #include<algorithm> using namespace st ...
- mysql事务四种隔离级别
事务的基本要素:原子性,一致性,隔离性,持久性. 事务并发问题:脏读,不可重复读,幻读. mysql隔离级别:read-uncommitted,read-committed,repeatable-re ...