如何让动态创建的EditText与Spinner同初始项一致排列于LinearLayout
解决动态添加控件与初始项布局不一致的问题
我明白你的问题啦——动态添加的设备控件和初始那组样式不一样,这是因为你现在是直接把EditText和Spinner垂直添加到布局里,而初始项是放在横向LinearLayout里,还有布局权重、边距、单行限制这些细节设置没跟上。咱们通过复用统一的布局Item来彻底解决这个问题,保证所有设备项样式完全一致:
步骤1:创建复用的设备项布局
新建一个布局文件layout_appliance_item.xml,把初始项的横向布局逻辑抽出来,这样所有设备项(包括初始和动态添加的)都用这个布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="10dp"> <EditText android:id="@+id/et_appliance" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:hint="Appliance" android:inputType="text" android:singleLine="true" android:textColor="@color/black" /> <Spinner android:id="@+id/sp_appliance" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="2" /> </LinearLayout>
步骤2:修改原Activity布局
把原来的初始设备项换成这个复用的布局,同时调整textLayout的位置(现在它用来放所有动态添加的设备项):
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".CreateAppliance"> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 初始设备项,使用复用布局 --> <include layout="@layout/layout_appliance_item" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" /> <!-- 动态添加的设备项会放在这里 --> <LinearLayout android:id="@+id/textLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" /> <Button android:id="@+id/btnAddAppliance" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_margin="10dp" android:background="@drawable/button_rounded" android:backgroundTint="@color/light_blue_900" android:drawableRight="@drawable/plus" android:paddingLeft="40dp" android:paddingRight="40dp" android:text="Add Appliance" android:textColor="@color/white" /> <Button android:id="@+id/btnCreateAppliance" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="10dp" android:background="@drawable/button_rounded" android:backgroundTint="@color/light_blue_900" android:paddingLeft="40dp" android:paddingRight="40dp" android:text="Create Appliance" android:textColor="@color/white" /> </LinearLayout> </ScrollView> </android.support.constraint.ConstraintLayout>
步骤3:修改Java代码,动态加载复用布局
现在点击添加按钮时,我们Inflate这个复用布局,而不是单独创建EditText和Spinner,这样样式会自动和初始项一致:
public class CreateAppliance extends AppCompatActivity { int i = 1; List<EditText> edList = new ArrayList<>(); List<Spinner> spList = new ArrayList<>(); String[] arraySpinner = {"ON/OFF", "Dimmer"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_appliance); final LinearLayout textLayout = findViewById(R.id.textLayout); Button btnAddAppliance = findViewById(R.id.btnAddAppliance); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, arraySpinner); // 先把初始项的控件加入列表(如果需要后续处理的话) EditText initialEt = findViewById(R.id.et_appliance); Spinner initialSp = findViewById(R.id.sp_appliance); initialSp.setAdapter(adapter); edList.add(initialEt); spList.add(initialSp); btnAddAppliance.setOnClickListener(v -> { i++; // Inflate复用的设备项布局 View itemView = LayoutInflater.from(CreateAppliance.this).inflate(R.layout.layout_appliance_item, textLayout, false); // 获取布局里的EditText和Spinner EditText editText = itemView.findViewById(R.id.et_appliance); Spinner spinner = itemView.findViewById(R.id.sp_appliance); // 设置属性 editText.setHint("Appliance " + i); spinner.setAdapter(adapter); // 添加到布局和列表 textLayout.addView(itemView); edList.add(editText); spList.add(spinner); }); } }
为什么这样能解决问题?
- 原来的代码是直接把EditText和Spinner垂直添加到
textLayout,但初始项是放在横向LinearLayout里,还设置了layout_weight来分配宽度,以及边距、单行限制等样式,动态创建时这些属性都没设置,所以样式不一致。 - 通过复用统一的布局Item,不管是初始项还是动态添加的项,都使用完全相同的布局结构和样式属性,自然就能保证布局效果完全一致了。
内容的提问来源于stack exchange,提问作者user9838866
相关产品推荐
相关产品推荐

