Android GridLayout中layout_rowWeight无法均等分配子项宽度问题
GridLayout子项宽度无法均等分配的问题
我在布局中使用GridLayout,设置为2行4列共8个子项,每个子项都添加了layout_rowWeight="1"和layout_columnWeight="1"属性,但实际显示中子项宽度分配不均——前三个子项宽度较大,最后一个子项宽度偏小。
以下是我的布局XML代码:
<GridLayout android:rowCount="2" android:columnCount="4" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/qrcode_item" android:orientation="vertical" android:gravity="center" android:layout_rowWeight="1" android:layout_columnWeight="1"> <ImageView android:layout_width="21dp" android:layout_height="21dp" android:src="@drawable/ic_qrcode" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:text="@string/qrcode_item" android:textColor="#363636" android:textSize="12sp" /> </LinearLayout> <LinearLayout android:id="@+id/grade_item" android:orientation="vertical" android:gravity="center" android:layout_rowWeight="1" android:layout_columnWeight="1"> <ImageView android:layout_width="20dp" android:layout_height="23dp" android:src="@drawable/ic_grade" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="11dp" android:text="@string/grade_item" android:textColor="#363636" android:textSize="12sp" /> </LinearLayout> <LinearLayout android:id="@+id/study_item" android:orientation="vertical" android:gravity="center" android:layout_rowWeight="1" android:layout_columnWeight="1"> <ImageView android:layout_width="19dp" android:layout_height="24dp" android:src="@drawable/ic_study" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="11dp" android:text="@string/study_item" android:textColor="#363636" android:textSize="12sp" /> </LinearLayout> <LinearLayout android:id="@+id/map_item" android:orientation="vertical" android:gravity="center" android:layout_rowWeight="1" android:layout_columnWeight="1"> <ImageView android:layout_width="20dp" android:layout_height="20dp" android:src="@drawable/ic_map" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:text="@string/map_item" android:textColor="#363636" android:textSize="12sp" /> </LinearLayout> <LinearLayout android:id="@+id/calendar_item" android:orientation="vertical" android:gravity="center" android:layout_rowWeight="1" android:layout_columnWeight="1"> <ImageView android:layout_width="22dp" android:layout_height="22dp" android:src="@drawable/ic_calendar" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="11dp" android:text="@string/calendar_item" android:textColor="#363636" android:textSize="12sp" /> </LinearLayout> <LinearLayout android:id="@+id/network_item" android:orientation="vertical" android:gravity="center" android:layout_rowWeight="1" android:layout_columnWeight="1"> <ImageView android:layout_width="28dp" android:layout_height="21dp" android:src="@drawable/ic_internet" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:text="@string/network_item" android:textColor="#363636" android:textSize="12sp" /> </LinearLayout> <LinearLayout android:id="@+id/contact_item" android:orientation="vertical" android:gravity="center" android:layout_rowWeight="1" android:layout_columnWeight="1"> <ImageView android:layout_width="23dp" android:layout_height="20dp" android:src="@drawable/ic_contact" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="13dp" android:text="@string/contact_item" android:textColor="#363636" android:textSize="12sp" /> </LinearLayout> <LinearLayout android:id="@+id/more_item" android:orientation="vertical" android:gravity="center" android:layout_rowWeight="1" android:layout_columnWeight="1"> <ImageView android:layout_width="20dp" android:layout_height="20dp" android:src="@drawable/ic_more" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:text="@string/more_item" android:textColor="#363636" android:textSize="12sp" /> </LinearLayout> </GridLayout>
解决方法
问题出在子项的layout_width属性——默认的wrap_content会让GridLayout先给子项分配内容所需的宽度,再用权重平分剩余空间。如果子项内容宽度不一致,最终显示的总宽度就会有差异。
只需要给每个子项的LinearLayout添加android:layout_width="0dp",让控件完全按照权重分配父布局的宽度,忽略自身内容的宽度限制:
<LinearLayout android:id="@+id/qrcode_item" android:orientation="vertical" android:gravity="center" android:layout_width="0dp" <!-- 添加这一行 --> android:layout_rowWeight="1" android:layout_columnWeight="1"> <!-- 内部控件保持不变 --> </LinearLayout>
对所有8个子项都做同样的修改,就能实现4列宽度完全均等的效果。
内容的提问来源于stack exchange,提问作者Hhry
相关产品推荐
相关产品推荐

