我是靠谱客的博主 坚强老虎,这篇文章主要介绍解决Android Studio xml 格式化不自动换行的问题,现在分享给大家,希望可以做个参考。

今天把Android Studio 2.3 更新为了3.0 遇到一个蛋疼的问题

如图:

格式化完代码后发现不会自动换行了,看着真心不爽。

后来发现其实是设置问题,如图:

只要把这里打上√就可以了。

在此记录一下,希望可以帮到后面的小伙伴

补充知识:Android实现控件内自动换行(比如LinearLayout内部实现子控件换行 )

一、创建类AntoLineUtil(换行操作主要在这里实现)

复制代码
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
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
package com.inpor.fmctv.util; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import com.inpor.fmctv.R; public class AntoLineUtil extends ViewGroup { /** * 子view左右间距 */ private int mHorizontalSpacing; /** * 子view上下行距离 */ private int mVerticalSpacing; private Context context; public AntoLineUtil(Context context) { this(context, null); this.context = context; } public AntoLineUtil(Context context, AttributeSet attrs) { this(context, attrs, 0); } public AntoLineUtil(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); if (attrs != null) { TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.AntoLineUtil); mHorizontalSpacing = array.getDimensionPixelOffset( R.styleable.AntoLineUtil_horizontalSpacing, 0); mVerticalSpacing = array.getDimensionPixelOffset( R.styleable.AntoLineUtil_verticalSpacing, 0); array.recycle(); if (mHorizontalSpacing < 0) mHorizontalSpacing = 0; if (mVerticalSpacing < 0) mVerticalSpacing = 0; } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int count = getChildCount(); for (int i = 0; i < count; i++) { measureChild(getChildAt(i), widthMeasureSpec, heightMeasureSpec); } int widthMode = MeasureSpec.getMode(widthMeasureSpec); if (widthMode != MeasureSpec.EXACTLY) { widthMeasureSpec = MeasureSpec.makeMeasureSpec( getAutoLinefeedWidth(width), widthMode); } int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (heightMode != MeasureSpec.EXACTLY) { heightMeasureSpec = MeasureSpec.makeMeasureSpec( getAutoLinefeedHeight(width), heightMode); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } /** * 自动换行 计算需要的宽度 * * @param width 可用宽度 * @return 需要的宽度 */ private int getAutoLinefeedWidth(int width) { int totalWidth = getPaddingLeft() + getPaddingRight(); for (int i = 0; i < getChildCount(); i++) { if (i > 0) totalWidth += mHorizontalSpacing; View child = getChildAt(i); int childWidth = child.getMeasuredWidth(); totalWidth += childWidth; if (totalWidth >= width) { totalWidth = width; break; } } return totalWidth; } /** * 自动换行 计算需要的高度 * * @param width 可用宽度 * @return 需要的高度 */ private int getAutoLinefeedHeight(int width) { //一行最大可用宽度 int lineWidth = width - getPaddingLeft() - getPaddingRight(); //剩余可用宽度 int availableLineWidth = lineWidth; //需要的高度 int totalHeight = getPaddingTop() + getPaddingBottom(); int lineChildIndex = 0; //本行最大高度 int lineMaxHeight = 0; for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); int childWidth = child.getMeasuredWidth(); int childHeight = child.getMeasuredHeight(); //这个child需要的宽度 如果不是第一位的 那么需要加上间距 //这里是用来判断需不需要换行 int needWidth = i == 0 ? childWidth : (childWidth + mHorizontalSpacing); //如果剩余可用宽度小于需要的长度 那么换行 if (availableLineWidth < needWidth) { totalHeight = totalHeight + lineMaxHeight; if (i > 0) totalHeight += mVerticalSpacing; availableLineWidth = lineWidth; lineMaxHeight = 0; lineChildIndex = 0; } //这个child需要的宽度 如果不是第一位的 那么需要加上间距 int realNeedWidth = lineChildIndex == 0 ? childWidth : (childWidth + mHorizontalSpacing); lineMaxHeight = Math.max(childHeight, lineMaxHeight); availableLineWidth = availableLineWidth - realNeedWidth; lineChildIndex++; } totalHeight = totalHeight + lineMaxHeight; return totalHeight; } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { layout(); } private void layout() { int count = getChildCount(); int childLeft = getPaddingLeft(); int childTop = getPaddingTop(); int lineWidth = getMeasuredWidth() - getPaddingRight() - getPaddingLeft(); int availableLineWidth = lineWidth; int lineChildIndex = 0; //一行的最大高度 int lineMaxHeight = 0; for (int i = 0; i < count; i++) { View child = getChildAt(i); int childWidth = child.getMeasuredWidth(); int childHeight = child.getMeasuredHeight(); int needWidth = i == 0 ? childWidth : (childWidth + mHorizontalSpacing); if (availableLineWidth < needWidth) { availableLineWidth = lineWidth; childTop += lineMaxHeight; if (i > 0) childTop += mVerticalSpacing; lineMaxHeight = 0; childLeft = getPaddingLeft(); lineChildIndex = 0; } int realNeedWidth = lineChildIndex == 0 ? childWidth : (childWidth + mHorizontalSpacing); lineMaxHeight = Math.max(lineMaxHeight, childHeight); child.layout(childLeft + realNeedWidth - childWidth, childTop, childLeft + realNeedWidth, childTop + childHeight); availableLineWidth -= realNeedWidth; childLeft += realNeedWidth; lineChildIndex++; } } public int getHorizontalSpacing() { return mHorizontalSpacing; } public void setHorizontalSpacing(int horizontalSpacing) { mHorizontalSpacing = horizontalSpacing; } public int getVerticalSpacing() { return mVerticalSpacing; } public void setVerticalSpacing(int verticalSpacing) { mVerticalSpacing = verticalSpacing; } }

二、在values中的attrs.xml中添加以下代码(实现子控件的边距):

复制代码
1
2
3
4
<declare-styleable name="AntoLineUtil"> <attr name="horizontalSpacing" format="dimension"/> <attr name="verticalSpacing" format="dimension"/> </declare-styleable>

三、添加固定的xml布局父控件,事先写好,布局activity_video_preview.xml :

复制代码
1
2
3
4
5
6
7
8
9
<com.inpor.fmctv.util.AntoLineUtil android:id="@+id/camera_group" android:layout_width="@dimen/size_dp_630" android:layout_height="@dimen/size_dp_138" android:layout_marginTop="@dimen/size_dp_18" android:orientation="horizontal" app:horizontalSpacing="@dimen/size_dp_18" app:verticalSpacing="@dimen/size_dp_18"> </com.inpor.fmctv.util.AntoLineUtil>

四、添加固定的xml布局子控件,事先写好,动态添加进去,布局item_camera_info.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
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/video_preview_item" android:layout_width="@dimen/size_dp_198" android:layout_height="@dimen/size_dp_60" android:orientation="horizontal" android:paddingLeft="@dimen/size_dp_18" android:paddingRight="@dimen/size_dp_18" android:gravity="center_vertical" android:background="@color/textcolor_395878"> <TextView android:id="@+id/video_preview_item_tv" android:layout_width="@dimen/size_dp_120" android:layout_height="wrap_content" android:textSize="@dimen/size_sp_24" android:textColor="@color/white"/> <CheckBox android:id="@+id/video_previ" android:layout_width="@dimen/size_dp_24" android:layout_height="@dimen/size_dp_24" android:button="@null" android:background="@drawable/radio_button_select_ico" /> </LinearLayout>

五、在其他方法中动态添加子控件:

复制代码
1
2
3
4
5
6
7
8
9
AntoLineUtil cameraGroup = (AntoLineUitl) findViewById(R.id.camera_group); // 此处是找到父控件LinearLayout for (int i = 0; i<6; i++) { // 用以下方法将layout布局文件换成view LayoutInflater inflater = getLayoutInflater(); View view = inflater.inflate(R.layout.item_camera_info,null); TextView textView = view.findViewById(R.id.video_preview_item_tv); textView.setText("摄像头"+ (cameraId+1)); cameraGroup.addView(view); }

六、效果图:

以上这篇解决Android Studio xml 格式化不自动换行的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持靠谱客。

最后

以上就是坚强老虎最近收集整理的关于解决Android Studio xml 格式化不自动换行的问题的全部内容,更多相关解决Android内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(145)

评论列表共有 0 条评论

立即
投稿
返回
顶部