自动换行&&自动补全TextView
来源:互联网 发布:高考逆袭 知乎 编辑:程序博客网 时间:2024/06/11 19:43
效果图:
工具类MultipleTextViewGroup:
package util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.example.autotextview.R;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MultipleTextViewGroup extends RelativeLayout {
private Context context;
private float textSize;
private int textColor;
private int wordMargin;
private int lineMargin;
private int textPaddingLeft;
private int textPaddingRight;
private int textPaddingTop;
private int textPaddingBottom;
private boolean overspread;
private int columnNum;
private int textBackground;
private int layout_width;
private OnMultipleTVItemClickListener listener;
public MultipleTextViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
TypedArray array = context.obtainStyledAttributes(attrs,
R.styleable.MultipleTextViewGroup);
textColor = array.getColor(R.styleable.MultipleTextViewGroup_textColor,
0XFF00FF00); // 提供默认值,放置未指定
textSize = array.getDimension(
R.styleable.MultipleTextViewGroup_textSize, 24);
textSize = px2sp(context, textSize);
wordMargin = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textWordMargin, 0);
lineMargin = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textLineMargin, 0);
textBackground = array.getResourceId(
R.styleable.MultipleTextViewGroup_textBackground, -1);
textPaddingLeft = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textPaddingLeft, 0);
textPaddingRight = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textPaddingRight, 0);
textPaddingTop = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textPaddingTop, 0);
textPaddingBottom = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textPaddingBottom, 0);
overspread = array.getBoolean(
R.styleable.MultipleTextViewGroup_overspread, false);
columnNum = array.getInteger(
R.styleable.MultipleTextViewGroup_columnNum, 1000);
array.recycle();
// 下边是获取系统属性
int[] attrsArray = new int[] { android.R.attr.id, // 0
android.R.attr.background, // 1
android.R.attr.layout_width, // 2
android.R.attr.layout_height, // 3
android.R.attr.layout_marginLeft, // 4
android.R.attr.layout_marginRight // 5
};
TypedArray ta = context.obtainStyledAttributes(attrs, attrsArray);
try {
layout_width = ta.getDimensionPixelSize(2,
ViewGroup.LayoutParams.MATCH_PARENT);
} catch (Exception e) {
DisplayMetrics dm = getResources().getDisplayMetrics();
layout_width = dm.widthPixels;
}
int marginRight = ta.getDimensionPixelSize(4, 0);
int marginLeft = ta.getDimensionPixelSize(5, 0);
layout_width = layout_width - marginRight - marginLeft;
ta.recycle();
}
public OnMultipleTVItemClickListener getOnMultipleTVItemClickListener() {
return listener;
}
public void setOnMultipleTVItemClickListener(
OnMultipleTVItemClickListener listener) {
this.listener = listener;
}
@SuppressLint("UseSparseArrays")
public void setTextViews(List<String> dataList) {
if (dataList == null || dataList.size() == 0) {
return;
}
int line = 0;
Map<Integer, List<TextView>> lineMap = new HashMap<Integer, List<TextView>>();
List<TextView> lineList = new ArrayList<TextView>();
lineMap.put(0, lineList);
int x = 0;
int y = 0;
for (int i = 0; i < dataList.size(); i++) {
TextView tv = new TextView(context);
tv.setText(dataList.get(i));
tv.setTextSize(textSize);
if (textBackground != -1)
tv.setBackgroundResource(textBackground);
tv.setTextColor(textColor);
tv.setPadding(textPaddingLeft, textPaddingTop, textPaddingRight,
textPaddingBottom);
tv.setTag(i);// 标记position
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onMultipleTVItemClick(v, (Integer) v.getTag());
}
}
});
int w = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
tv.measure(w, h);
int tvh = tv.getMeasuredHeight();
int tvw = getMeasuredWidth(tv);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
if (x + tvw > layout_width || lineMap.get(line).size() >= columnNum) {
x = 0;
y = y + tvh + lineMargin;
line++;
lineMap.put(line, new ArrayList<TextView>());
}
lp.leftMargin = x;
lp.topMargin = y;
x = x + tvw + wordMargin;
tv.setLayoutParams(lp);
lineMap.get(line).add(tv);
}
for (int i = 0; i <= line; i++) {
int padding = 0;
if (overspread) {
// 该行最后一个位置
int len = lineMap.get(i).size();
TextView tView = lineMap.get(i).get(len - 1);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) tView
.getLayoutParams();
int right = lp.leftMargin + getMeasuredWidth(tView);
int emptyWidth = layout_width - right;
padding = emptyWidth / (len * 2);
}
int leftOffset = 0;
for (int j = 0; j < lineMap.get(i).size(); j++) {
TextView tView2 = lineMap.get(i).get(j);
if (overspread) {
RelativeLayout.LayoutParams lp2 = (RelativeLayout.LayoutParams) tView2
.getLayoutParams();
lp2.leftMargin = lp2.leftMargin + leftOffset;
leftOffset = (j + 1) * 2 * padding;
}
tView2.setPadding(tView2.getPaddingLeft() + padding,
tView2.getPaddingTop(), tView2.getPaddingRight()
+ padding, tView2.getPaddingBottom());
addView(tView2);
}
}
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
}
public int getMeasuredWidth(View v) {
return v.getMeasuredWidth();
}
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
public interface OnMultipleTVItemClickListener {
void onMultipleTVItemClick(View view, int position);
}
}
attrs.xml:
<resources>
<declare-styleable name="MultipleTextViewGroup">
<attr name="textColor" format="color" />
<attr name="textSize" format="dimension" />
<attr name="textWordMargin" format="dimension" />
<attr name="textLineMargin" format="dimension" />
<attr name="textBackground" format="reference" />
<attr name="textPaddingLeft" format="dimension" />
<attr name="textPaddingRight" format="dimension" />
<attr name="textPaddingTop" format="dimension" />
<attr name="textPaddingBottom" format="dimension" />
<attr name="overspread" format="boolean" />
<attr name="columnNum" format="integer" />
</declare-styleable>
</resources>
shape.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners android:radius="2dp" />
<stroke
android:width="1px"
android:color="#ddd" />
<solid android:color="#eee" />
</shape>
activity_main.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_rl"
android:layout_width="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_height="wrap_content"
app:textSize="12sp"
app:textWordMargin="10dp"
app:textLineMargin="10dp"
app:textColor="#ff0000"
app:textBackground="@drawable/shape_tag_grey_with_border"
app:textPaddingLeft="10dp"
app:textPaddingRight="10dp"
app:textPaddingTop="10dp"
app:textPaddingBottom="10dp"
app:columnNum="2"
app:overspread="true" />
</FrameLayout>
columnNum:设置每行显示的TextView个数(可不设)
overspread:设置每行最后一个TextView是否填充剩余空间
MainActivity:
package com.example.autotextview;
import java.util.ArrayList;
import java.util.List;
import util.MultipleTextViewGroup;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity implements
MultipleTextViewGroup.OnMultipleTVItemClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<String> dataList = new ArrayList<String>();
dataList.add("火女");
dataList.add("狼人");
dataList.add("DOTA && 英雄联盟");
dataList.add("疯狂的伐木机");
dataList.add("门前大桥下游过一群鸭");
dataList.add("大家快来数一数");
dataList.add("五四六七八");
dataList.add("咕嘎咕嘎");
dataList.add("真呀真多啊");
dataList.add("数不清到底多少鸭");
dataList.add("呀");
dataList.add("丫");
MultipleTextViewGroup rl = (MultipleTextViewGroup) findViewById(R.id.main_rl);
rl.setOnMultipleTVItemClickListener(this);
rl.setTextViews(dataList);
}
public void onMultipleTVItemClick(View view, int position) {
Toast.makeText(getApplicationContext(), "点了第" + position + "个按钮",
Toast.LENGTH_SHORT).show();
}
}
- 自动换行&&自动补全TextView
- textView属性全解,自动换行
- android TextView 自动换行
- TextView 实现自动换行
- Android TextView自动换行
- Android TextView 自动换行
- 解决TextView自动换行
- Android TextView自动换行
- android textview 自动换行
- TextView自动换行
- TextView 判断自动换行
- TextView实现自动换行
- Vim大括号自动补全换行并缩进
- 【整理】取消eclipse for php 括号自动补全闭合,修改自动匹配,开启自动换行
- 对于vim盘自动补全{如何换行补全}的代码
- 自动补全
- jquery自动补全
- 自动补全
- 【扣丁学堂】大神教你如何修改教务系统上的成绩
- Java 8的Lambda及其在Android 开发中的应用
- TabHost中执行子Activity的OnResume方法
- dropzone.js 拖拽上传文件
- spring 从jsp页面传array数组到后台,自动转化为java的数组类型
- 自动换行&&自动补全TextView
- iOS AVAudioSession、AudioSession Category选择和声音通道听筒、扬声器切换
- HTML页面中<select>
- HTML中的普通流与formatting context
- <iOS>数据缓存
- 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
- java使用siger 轻松获取本机硬件信息(CPU 内存 网络 io等)
- LeetCode 刷题2 (digit sum)
- HDU 5476 Explore Track of Point