代码已经整理好,这里要说一下,因为手动和Json获取写法不一样。
手动直接xml设置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<code> </code><code><LinearLayout xmlns:android=</code><code>"http://schemas.android.com/apk/res/android"</code>
<code> </code><code>xmlns:tools=</code><code>"http://schemas.android.com/tools"</code>
<code> </code><code>android:layout_width=</code><code>"fill_parent"</code>
<code> </code><code>android:layout_height=</code><code>"fill_parent"</code>
<code> </code><code>android:background=</code><code>"#E1E6F6"</code>
<code> </code><code>android:orientation=</code><code>"vertical"</code> <code>></code>
<code> </code><code><com.zhy.zhy_flowlayout02.FlowLayout</code>
<code> </code><code>android:layout_width=</code><code>"fill_parent"</code>
<code> </code><code>android:layout_height=</code><code>"wrap_content"</code> <code>></code>
<code> </code><code><TextView</code>
<code> </code><code>style=</code><code>"@style/text_flag_01"</code>
<code> </code><code>android:text=</code><code>"Welcome"</code> <code>/></code>
<code> </code><code>android:text=</code><code>"IT工程师"</code> <code>/></code>
<code> </code><code>android:text=</code><code>"学习ing"</code> <code>/></code>
<code> </code><code>android:text=</code><code>"恋爱ing"</code> <code>/></code>
<code> </code><code>android:text=</code><code>"挣钱ing"</code> <code>/></code>
<code> </code><code>android:text=</code><code>"努力ing"</code> <code>/></code>
<code> </code><code>android:text=</code><code>"I thick i can"</code> <code>/></code>
<code> </code><code></com.zhy.zhy_flowlayout02.FlowLayout></code>
<code> </code>
<code> </code><code>android:layout_height=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_marginTop=</code><code>"20dp"</code> <code>></code>
<code> </code><code>android:background=</code><code>"@drawable/flag_02"</code>
<code> </code><code>android:text=</code><code>"Welcome"</code>
<code> </code><code>android:textColor=</code><code>"#888888"</code> <code>/></code>
<code> </code><code>android:text=</code><code>"IT工程师"</code>
<code> </code><code>android:text=</code><code>"学习ing"</code>
<code> </code><code>android:text=</code><code>"恋爱ing"</code>
<code> </code><code>android:text=</code><code>"挣钱ing"</code>
<code> </code><code>android:text=</code><code>"努力ing"</code>
<code> </code><code>android:text=</code><code>"I thick i can"</code>
<code> </code><code>android:background=</code><code>"@drawable/flag_03"</code>
<code> </code><code>android:textColor=</code><code>"#43BBE7"</code> <code>/></code>
<code></LinearLayout></code>
效果如下:
Json获取:
<code> </code><code>if</code><code>(message.what == </code><code>1</code><code>) {</code>
<code> </code><code>// 处理操作</code>
<code> </code><code>pingjia = newArrayList<Pingjia>();</code>
<code> </code><code>pingjia.addAll(JsonUtils.getBeanList(message.result,</code><code>"Items"</code><code>,</code>
<code> </code><code>Pingjia.</code><code>class</code><code>));</code>
<code> </code><code>FlowLayout layout = (FlowLayout)findViewById(R.id.layou23);</code>
<code> </code><code>LinearLayout.LayoutParams params = newLinearLayout.LayoutParams(</code>
<code> </code><code>LinearLayout.LayoutParams.WRAP_CONTENT,</code>
<code> </code><code>LinearLayout.LayoutParams.WRAP_CONTENT);</code>
<code> </code><code>params.gravity =Gravity.CENTER_VERTICAL;</code>
<code> </code>
<code> </code><code>// 加载TextView</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < pingjia.size();i++) {</code>
<code> </code><code>Pingjia ping = pingjia.get(i);</code>
<code> </code><code>tvNav = </code><code>new</code> <code>TextView(</code><code>this</code><code>);</code>
<code> </code><code>tvNav.setTextSize(</code><code>13</code><code>.f);</code>
<code> </code><code>// tvNav.setWidth((int)Math.floor(Double.valueOf(a)));</code>
<code> </code><code>// tvNav.setHeight((int)Math.floor(Double.valueOf(b)));</code>
<code> </code><code>tvNav.setText(ping.getContent());</code>
<code> </code><code>tvNav.setId(ping.getId());</code>
<code> </code><code>tvNav.setBackgroundResource(R.anim.flag_022);</code>
<code> </code><code>tvNav.setTag(</code><code>false</code><code>);</code>
<code> </code><code>tvNav.setTextColor(getResources().getColor(R.color.gray));</code>
<code> </code><code>// tvNav.setPadding(30, 10, 30, 10);</code>
<code> </code><code>// tvNav.setGravity(Gravity.CENTER_HORIZONTAL);</code>
<code> </code><code>tvNav.setOnClickListener(newTvClickListener(tvNav));</code>
<code> </code><code>layout.addView(tvNav, params);</code>
<code> </code><code>}</code>
<code> </code><code>private</code> <code>TextView tvNav;</code>
<code> </code><code>private</code> <code>String str = </code><code>""</code><code>;</code>
<code> </code><code>private</code> <code>String strId = </code><code>""</code><code>;</code>
<code> </code><code>/**</code>
<code> </code><code>* 标题栏textview 点击事件</code>
<code> </code><code>* </code>
<code> </code><code>* @author fei</code>
<code> </code><code>*/</code>
<code> </code><code>private</code> <code>final</code> <code>class</code> <code>TvClickListener </code><code>implements</code> <code>View.OnClickListener {</code>
<code> </code><code>// private int index;</code>
<code> </code><code>private</code> <code>TextView tvNav;</code>
<code> </code><code>public</code> <code>TvClickListener(TextView tvNav) {</code>
<code> </code><code>super</code><code>();</code>
<code> </code><code>// this.index = index;</code>
<code> </code><code>this</code><code>.tvNav = tvNav;</code>
<code> </code><code>}</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>onClick(View v) {</code>
<code> </code><code>Boolean isclick = (Boolean) tvNav.getTag();</code>
<code> </code><code>if</code> <code>(!isclick) {</code>
<code> </code><code>tvNav.setBackgroundResource(R.anim.flag_0444);</code>
<code> </code><code>tvNav.setTextColor(getResources().getColor(R.color.red));</code>
<code> </code><code>tvNav.setTag(</code><code>true</code><code>);</code>
<code> </code><code>// 显示到上面</code>
<code> </code><code>str = str + tvNav.getText().toString() + </code><code>","</code><code>;</code>
<code> </code><code>ed_en.setText(str);</code>
<code> </code><code>// 记录Id</code>
<code> </code><code>strId = strId + tvNav.getId() + </code><code>","</code><code>;</code>
<code> </code><code>// strId = strId.substring(0, strId.length() - 1);</code>
<code> </code><code>// MyLogUtil.v("传->strId", strId);</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>tvNav.setBackgroundResource(R.anim.flag_022);</code>
<code> </code><code>tvNav.setTextColor(getResources().getColor(R.color.gray));</code>
<code> </code><code>tvNav.setTag(</code><code>false</code><code>);</code>
<code> </code><code>str = str.replace(tvNav.getText().toString() + </code><code>","</code><code>, </code><code>""</code><code>);</code>
<code> </code><code>strId = strId.replace(tvNav.getId() + </code><code>","</code><code>, </code><code>""</code><code>);</code>
<code> </code><code>// MyLogUtil.v("Delete->strId", strId);</code>
<code> </code><code>}</code>
<code> </code><code>// ToastUtil.showToastLong(tvNav.getId() + ","</code>
<code> </code><code>// + tvNav.getText().toString());</code>
xml设置:
<code> </code><code><LinearLayout</code>
<code> </code><code>android:layout_width=</code><code>"fill_parent"</code>
<code> </code><code>android:layout_height=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_marginBottom=</code><code>"@dimen/dimens_10"</code>
<code> </code><code>android:layout_marginLeft=</code><code>"@dimen/x10"</code>
<code> </code><code>android:layout_marginRight=</code><code>"@dimen/x10"</code>
<code> </code><code>android:layout_marginTop=</code><code>"@dimen/y20"</code>
<code> </code><code>android:orientation=</code><code>"vertical"</code> <code>></code>
<code> </code><code><TextView</code>
<code> </code><code>android:layout_width=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_height=</code><code>"wrap_content"</code>
<code> </code><code>android:drawableLeft=</code><code>"@drawable/biaoqian1"</code>
<code> </code><code>android:drawablePadding=</code><code>"@dimen/dimens_10"</code>
<code> </code><code>android:text=</code><code>"@string/bq3"</code>
<code> </code><code>android:textColor=</code><code>"@color/black"</code>
<code> </code><code>android:textSize=</code><code>"15sp"</code> <code>/></code>
<code> </code><code><com.kangxin.patient.utils.FlowLayout</code>
<code> </code><code>android:id=</code><code>"@+id/layou23"</code>
<code> </code><code>android:layout_width=</code><code>"fill_parent"</code>
<code> </code><code>android:layout_marginTop=</code><code>"@dimen/y10"</code>
<code> </code><code>android:orientation=</code><code>"vertical"</code> <code>></code>
<code> </code><code></com.kangxin.patient.utils.FlowLayout></code>
<code> </code><code></LinearLayout></code>
最后是自定义layout类FlowLayout:
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
<code>package</code> <code>com.zhy.zhy_flowlayout02;</code>
<code>import</code> <code>java.util.ArrayList;</code>
<code>import</code> <code>java.util.List;</code>
<code>import</code> <code>android.content.Context;</code>
<code>import</code> <code>android.util.AttributeSet;</code>
<code>import</code> <code>android.util.Log;</code>
<code>import</code> <code>android.view.View;</code>
<code>import</code> <code>android.view.ViewGroup;</code>
<code>public</code> <code>class</code> <code>FlowLayout </code><code>extends</code> <code>ViewGroup</code>
<code>{</code>
<code> </code><code>private</code> <code>static</code> <code>final</code> <code>String TAG = </code><code>"FlowLayout"</code><code>;</code>
<code> </code><code>public</code> <code>FlowLayout(Context context, AttributeSet attrs)</code>
<code> </code><code>{</code>
<code> </code><code>super</code><code>(context, attrs);</code>
<code> </code><code>@Override</code>
<code> </code><code>protected</code> <code>ViewGroup.LayoutParams generateLayoutParams(</code>
<code> </code><code>ViewGroup.LayoutParams p)</code>
<code> </code><code>return</code> <code>new</code> <code>MarginLayoutParams(p);</code>
<code> </code><code>public</code> <code>ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs)</code>
<code> </code><code>return</code> <code>new</code> <code>MarginLayoutParams(getContext(), attrs);</code>
<code> </code><code>protected</code> <code>ViewGroup.LayoutParams generateDefaultLayoutParams()</code>
<code> </code><code>return</code> <code>new</code> <code>MarginLayoutParams(LayoutParams.MATCH_PARENT,</code>
<code> </code><code>LayoutParams.MATCH_PARENT);</code>
<code> </code><code>* 负责设置子控件的测量模式和大小 根据所有子控件设置自己的宽和高</code>
<code> </code><code>protected</code> <code>void</code> <code>onMeasure(</code><code>int</code> <code>widthMeasureSpec, </code><code>int</code> <code>heightMeasureSpec)</code>
<code> </code><code>super</code><code>.onMeasure(widthMeasureSpec, heightMeasureSpec);</code>
<code> </code><code>// 获得它的父容器为它设置的测量模式和大小</code>
<code> </code><code>int</code> <code>sizeWidth = MeasureSpec.getSize(widthMeasureSpec);</code>
<code> </code><code>int</code> <code>sizeHeight = MeasureSpec.getSize(heightMeasureSpec);</code>
<code> </code><code>int</code> <code>modeWidth = MeasureSpec.getMode(widthMeasureSpec);</code>
<code> </code><code>int</code> <code>modeHeight = MeasureSpec.getMode(heightMeasureSpec);</code>
<code> </code><code>Log.e(TAG, sizeWidth + </code><code>","</code> <code>+ sizeHeight);</code>
<code> </code><code>// 如果是warp_content情况下,记录宽和高</code>
<code> </code><code>int</code> <code>width = </code><code>0</code><code>;</code>
<code> </code><code>int</code> <code>height = </code><code>0</code><code>;</code>
<code> </code><code>/**</code>
<code> </code><code>* 记录每一行的宽度,width不断取最大宽度</code>
<code> </code><code>*/</code>
<code> </code><code>int</code> <code>lineWidth = </code><code>0</code><code>;</code>
<code> </code><code>* 每一行的高度,累加至height</code>
<code> </code><code>int</code> <code>lineHeight = </code><code>0</code><code>;</code>
<code> </code><code>int</code> <code>cCount = getChildCount();</code>
<code> </code><code>// 遍历每个子元素</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < cCount; i++)</code>
<code> </code><code>{</code>
<code> </code><code>View child = getChildAt(i);</code>
<code> </code><code>// 测量每一个child的宽和高</code>
<code> </code><code>measureChild(child, widthMeasureSpec, heightMeasureSpec);</code>
<code> </code><code>// 得到child的lp</code>
<code> </code><code>MarginLayoutParams lp = (MarginLayoutParams) child</code>
<code> </code><code>.getLayoutParams();</code>
<code> </code><code>// 当前子空间实际占据的宽度</code>
<code> </code><code>int</code> <code>childWidth = child.getMeasuredWidth() + lp.leftMargin</code>
<code> </code><code>+ lp.rightMargin;</code>
<code> </code><code>// 当前子空间实际占据的高度</code>
<code> </code><code>int</code> <code>childHeight = child.getMeasuredHeight() + lp.topMargin</code>
<code> </code><code>+ lp.bottomMargin;</code>
<code> </code><code>/**</code>
<code> </code><code>* 如果加入当前child,则超出最大宽度,则的到目前最大宽度给width,类加height 然后开启新行</code>
<code> </code><code>*/</code>
<code> </code><code>if</code> <code>(lineWidth + childWidth > sizeWidth)</code>
<code> </code><code>{</code>
<code> </code><code>width = Math.max(lineWidth, childWidth);</code><code>// 取最大的</code>
<code> </code><code>lineWidth = childWidth; </code><code>// 重新开启新行,开始记录</code>
<code> </code><code>// 叠加当前高度,</code>
<code> </code><code>height += lineHeight;</code>
<code> </code><code>// 开启记录下一行的高度</code>
<code> </code><code>lineHeight = childHeight;</code>
<code> </code><code>} </code><code>else</code>
<code> </code><code>// 否则累加值lineWidth,lineHeight取最大高度</code>
<code> </code><code>lineWidth += childWidth;</code>
<code> </code><code>lineHeight = Math.max(lineHeight, childHeight);</code>
<code> </code><code>// 如果是最后一个,则将当前记录的最大宽度和当前lineWidth做比较</code>
<code> </code><code>if</code> <code>(i == cCount - </code><code>1</code><code>)</code>
<code> </code><code>width = Math.max(width, lineWidth);</code>
<code> </code><code>setMeasuredDimension((modeWidth == MeasureSpec.EXACTLY) ? sizeWidth</code>
<code> </code><code>: width, (modeHeight == MeasureSpec.EXACTLY) ? sizeHeight</code>
<code> </code><code>: height);</code>
<code> </code><code>* 存储所有的View,按行记录</code>
<code> </code><code>private</code> <code>List<List<View>> mAllViews = </code><code>new</code> <code>ArrayList<List<View>>();</code>
<code> </code><code>* 记录每一行的最大高度</code>
<code> </code><code>private</code> <code>List<Integer> mLineHeight = </code><code>new</code> <code>ArrayList<Integer>();</code>
<code> </code><code>protected</code> <code>void</code> <code>onLayout(</code><code>boolean</code> <code>changed, </code><code>int</code> <code>l, </code><code>int</code> <code>t, </code><code>int</code> <code>r, </code><code>int</code> <code>b)</code>
<code> </code><code>mAllViews.clear();</code>
<code> </code><code>mLineHeight.clear();</code>
<code> </code><code>int</code> <code>width = getWidth();</code>
<code> </code><code>// 存储每一行所有的childView</code>
<code> </code><code>List<View> lineViews = </code><code>new</code> <code>ArrayList<View>();</code>
<code> </code><code>// 遍历所有的孩子</code>
<code> </code><code>int</code> <code>childWidth = child.getMeasuredWidth();</code>
<code> </code><code>int</code> <code>childHeight = child.getMeasuredHeight();</code>
<code> </code><code>// 如果已经需要换行</code>
<code> </code><code>if</code> <code>(childWidth + lp.leftMargin + lp.rightMargin + lineWidth > width)</code>
<code> </code><code>// 记录这一行所有的View以及最大高度</code>
<code> </code><code>mLineHeight.add(lineHeight);</code>
<code> </code><code>// 将当前行的childView保存,然后开启新的ArrayList保存下一行的childView</code>
<code> </code><code>mAllViews.add(lineViews);</code>
<code> </code><code>lineWidth = </code><code>0</code><code>;</code><code>// 重置行宽</code>
<code> </code><code>lineViews = </code><code>new</code> <code>ArrayList<View>();</code>
<code> </code><code>* 如果不需要换行,则累加</code>
<code> </code><code>lineWidth += childWidth + lp.leftMargin + lp.rightMargin;</code>
<code> </code><code>lineHeight = Math.max(lineHeight, childHeight + lp.topMargin</code>
<code> </code><code>+ lp.bottomMargin);</code>
<code> </code><code>lineViews.add(child);</code>
<code> </code><code>// 记录最后一行</code>
<code> </code><code>mLineHeight.add(lineHeight);</code>
<code> </code><code>mAllViews.add(lineViews);</code>
<code> </code><code>int</code> <code>left = </code><code>0</code><code>;</code>
<code> </code><code>int</code> <code>top = </code><code>0</code><code>;</code>
<code> </code><code>// 得到总行数</code>
<code> </code><code>int</code> <code>lineNums = mAllViews.size();</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < lineNums; i++)</code>
<code> </code><code>// 每一行的所有的views</code>
<code> </code><code>lineViews = mAllViews.get(i);</code>
<code> </code><code>// 当前行的最大高度</code>
<code> </code><code>lineHeight = mLineHeight.get(i);</code>
<code> </code><code>Log.e(TAG, </code><code>"第"</code> <code>+ i + </code><code>"行 :"</code> <code>+ lineViews.size() + </code><code>" , "</code> <code>+ lineViews);</code>
<code> </code><code>Log.e(TAG, </code><code>"第"</code> <code>+ i + </code><code>"行, :"</code> <code>+ lineHeight);</code>
<code> </code><code>// 遍历当前行所有的View</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>j = </code><code>0</code><code>; j < lineViews.size(); j++)</code>
<code> </code><code>View child = lineViews.get(j);</code>
<code> </code><code>if</code> <code>(child.getVisibility() == View.GONE)</code>
<code> </code><code>{</code>
<code> </code><code>continue</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>MarginLayoutParams lp = (MarginLayoutParams) child</code>
<code> </code><code>.getLayoutParams();</code>
<code> </code><code>//计算childView的left,top,right,bottom</code>
<code> </code><code>int</code> <code>lc = left + lp.leftMargin;</code>
<code> </code><code>int</code> <code>tc = top + lp.topMargin;</code>
<code> </code><code>int</code> <code>rc =lc + child.getMeasuredWidth();</code>
<code> </code><code>int</code> <code>bc = tc + child.getMeasuredHeight();</code>
<code> </code><code>Log.e(TAG, child + </code><code>" , l = "</code> <code>+ lc + </code><code>" , t = "</code> <code>+ t + </code><code>" , r ="</code>
<code> </code><code>+ rc + </code><code>" , b = "</code> <code>+ bc);</code>
<code> </code><code>child.layout(lc, tc, rc, bc);</code>
<code> </code>
<code> </code><code>left += child.getMeasuredWidth() + lp.rightMargin</code>
<code> </code><code>+ lp.leftMargin;</code>
<code> </code><code>left = </code><code>0</code><code>;</code>
<code> </code><code>top += lineHeight;</code>
<code>}</code>
本文转自 吴雨声 51CTO博客,原文链接:http://blog.51cto.com/liangxiao/1663535,如需转载请自行联系原作者