Android布局中如何将Spinner置于Checkbox右侧?
如何在Checkbox右侧正确添加Spinner?
现有Android布局代码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:src="@drawable/banner2" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/imageView1" android:contentDescription="@string/header" /> <View android:layout_width="match_parent" android:layout_height="2dp" android:layout_gravity="center" android:layout_marginTop="0sp" android:background="#000000" /> <HorizontalScrollView android:layout_width="wrap_content" android:layout_height="wrap_content"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:background="@color/colorGold" android:textStyle="bold" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cancel" android:id="@+id/btnCancel" /> </LinearLayout> </HorizontalScrollView> <View android:layout_width="match_parent" android:layout_height="2dp" android:layout_gravity="center" android:layout_marginTop="0sp" android:background="#000000" /> <TextView android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:gravity="center" android:text="@string/selectParticipantsToRegister" /> <ScrollView android:id="@+id/scrollView1" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:id="@+id/listlayout"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:id="@+id/listlayout"> </LinearLayout> </LinearLayout> </ScrollView> </LinearLayout>
原有稳定运行的代码(仅添加Checkbox)
for (int i=0; i < MyParticipants.Tables[0].Rows.Count; i++) { feature1 = new CheckBox(this); feature1.Text = MyParticipants.Tables[0].Rows[i]["name"].ToString(); feature1.Id = Convert.ToInt32(MyParticipants.Tables[0].Rows[i]["employeeid"].ToString()); feature1.CheckedChange += CheckBox_CheckedChange; list.AddView(feature1); }
尝试添加Spinner的代码(布局异常)
List<string> itemsNew = new List<string>(); itemsNew.Add("Select Program"); foreach (DataRow MyDataRow in MyProgramDataset.Tables[0].Rows) { if (!MyDataRow["Program"].ToString().ToUpper().Contains("FLAG")) { itemsNew.Add(MyDataRow["Program"].ToString()); } }; for (int i=0; i < MyParticipants.Tables[0].Rows.Count; i++) { feature1 = new CheckBox(this); feature1.Text = MyParticipants.Tables[0].Rows[i]["name"].ToString(); feature1.Id = Convert.ToInt32(MyParticipants.Tables[0].Rows[i]["employeeid"].ToString()); feature1.CheckedChange += CheckBox_CheckedChange; feature2 = new Spinner(this); // 关联Spinner与对应参与者 feature2.Id = Convert.ToInt32(MyParticipants.Tables[0].Rows[i]["employeeid"].ToString()); ArrayAdapter adapter = new ArrayAdapter(this, Resource.Layout.spinner_text_attr, itemsNew.ToArray()); feature2.Adapter = adapter; list.AddView(feature1); // 需要将Spinner放在Checkbox右侧 list.AddView(feature2); }
解决方法
问题根源:listlayout是垂直方向的LinearLayout,直接添加Checkbox和Spinner会导致两者上下排列。需要为每一组Checkbox+Spinner创建水平方向的LinearLayout容器,将两个控件放入该容器后,再添加到垂直布局中。
修改后的代码:
List<string> itemsNew = new List<string>(); itemsNew.Add("Select Program"); foreach (DataRow MyDataRow in MyProgramDataset.Tables[0].Rows) { if (!MyDataRow["Program"].ToString().ToUpper().Contains("FLAG")) { itemsNew.Add(MyDataRow["Program"].ToString()); } }; for (int i=0; i < MyParticipants.Tables[0].Rows.Count; i++) { // 创建水平布局,用于承载同一行的Checkbox和Spinner LinearLayout rowContainer = new LinearLayout(this); rowContainer.Orientation = Orientation.Horizontal; rowContainer.LayoutParameters = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent ); rowContainer.SetPadding(16, 16, 16, 16); // 设置内边距优化显示 // 初始化Checkbox CheckBox feature1 = new CheckBox(this); feature1.Text = MyParticipants.Tables[0].Rows[i]["name"].ToString(); feature1.Id = Convert.ToInt32(MyParticipants.Tables[0].Rows[i]["employeeid"].ToString()); feature1.CheckedChange += CheckBox_CheckedChange; // 设置Checkbox的布局参数,添加右侧间距 LinearLayout.LayoutParams checkBoxParams = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent ); checkBoxParams.MarginEnd = 16; feature1.LayoutParameters = checkBoxParams; // 初始化Spinner Spinner feature2 = new Spinner(this); feature2.Id = Convert.ToInt32(MyParticipants.Tables[0].Rows[i]["employeeid"].ToString()); ArrayAdapter adapter = new ArrayAdapter(this, Resource.Layout.spinner_text_attr, itemsNew.ToArray()); feature2.Adapter = adapter; // 设置Spinner权重为1,让它占据剩余水平空间 LinearLayout.LayoutParams spinnerParams = new LinearLayout.LayoutParams( 0, ViewGroup.LayoutParams.WrapContent, 1f ); feature2.LayoutParameters = spinnerParams; // 将控件添加到水平容器,再将容器添加到垂直布局 rowContainer.AddView(feature1); rowContainer.AddView(feature2); list.AddView(rowContainer); }
关键优化点
- 用水平LinearLayout作为每一行的容器,确保Checkbox和Spinner在同一行显示
- 通过
MarginEnd设置Checkbox与Spinner的间距,避免控件拥挤 - 给Spinner设置权重
1f,让它自动填充剩余水平空间,适配不同屏幕宽度
内容的提问来源于stack exchange,提问作者Prescott Chartier
相关产品推荐
相关产品推荐

