Android动态在LinearLayout中放置CheckBox与EditText布局异常求解
Android 动态添加清单项布局实现方案
核心问题:你当前仅使用了单层LinearLayout,这类布局仅支持单一方向排列,无法同时实现「单行内CheckBox+EditText水平排列、多行清单项垂直排列」的效果,两层嵌套LinearLayout即可满足需求,无需引入RecyclerView。
修改步骤
- 调整外层LinearLayout配置:将布局文件中id为
linear_layout的容器orientation属性改为vertical,这个容器负责所有清单项按行垂直排布。 - 新增单行水平容器:每次遍历清单项数据时,先创建一个
orientation为horizontal的LinearLayout作为单行容器,将当前行的CheckBox、EditText添加到该容器后,再把整个单行容器添加到外层垂直LinearLayout中。 - 修复原有代码的3处细节问题:
- 给EditText设置
layout_weight=1的布局参数,让它自动占满单行剩余宽度,不会出现宽度挤压、显示不全的问题 - 修正初始删除线的长度计算逻辑,原代码取CheckBox文本长度(CheckBox默认无文本,长度为0,删除线不会生效),改为取EditText的文本长度
- 给单行内的CheckBox、EditText加final修饰,避免循环变量覆盖导致所有行的选中事件都指向最后一个清单项的控件
- 给EditText设置
修改后完整代码
布局文件(activity_checklist_detail.xml 核心片段)
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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=".ChecklistDetail"> <include android:id="@+id/include4" layout="@layout/toolbar"/> <!-- 外层容器改为垂直方向 --> <LinearLayout android:id="@+id/linear_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/purple_200" android:layout_margin="10dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/include4" android:orientation="vertical"> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
ChecklistDetail Activity 核心逻辑代码
public class ChecklistDetail extends AppCompatActivity { Toolbar toolbar; LinearLayout linearLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_checklist_detail); toolbar= findViewById(R.id.tool_bar); setSupportActionBar(toolbar); linearLayout = findViewById(R.id.linear_layout); Intent intent = getIntent(); int id = intent.getIntExtra("id",0); String status = intent.getStringExtra("status"); String content = intent.getStringExtra("content"); String[] statusSplit = status.split("\n"); String[] contentSplit = content.split("\n"); for (int i = 0; i < contentSplit.length; i++) { final int j = i; // 创建单行水平容器 LinearLayout rowContainer = new LinearLayout(this); rowContainer.setOrientation(LinearLayout.HORIZONTAL); LinearLayout.LayoutParams rowParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT ); rowContainer.setLayoutParams(rowParams); // 初始化当前行控件 final CheckBox checkBox = new CheckBox(this); final EditText editText = new EditText(this); // 设置EditText权重,占满单行剩余宽度 LinearLayout.LayoutParams etParams = new LinearLayout.LayoutParams( 0, LinearLayout.LayoutParams.WRAP_CONTENT, 1 ); editText.setLayoutParams(etParams); boolean isChecked = statusSplit[i].equals("1"); editText.setText(contentSplit[i]); checkBox.setChecked(isChecked); // 初始化选中项的删除线效果 if(checkBox.isChecked()) { SpannableString spannableString = new SpannableString(editText.getText().toString()); StrikethroughSpan strikethroughSpan = new StrikethroughSpan(); spannableString.setSpan(strikethroughSpan, 0, editText.getText().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); editText.setText(spannableString); } // 组装行布局 rowContainer.addView(checkBox); rowContainer.addView(editText); linearLayout.addView(rowContainer); // 选中状态切换事件 checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { if(isChecked) { SpannableString spannableString = new SpannableString(editText.getText().toString()); StrikethroughSpan strikethroughSpan = new StrikethroughSpan(); spannableString.setSpan(strikethroughSpan,0, editText.getText().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); editText.setText(spannableString); } else { editText.setText(contentSplit[j]); } } }); } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.edit_save_menu,menu); return true; } }
修改完成后运行即可实现预期效果:每行水平排列一个CheckBox和对应输入框,所有清单项垂直依次排布,选中CheckBox时输入框内容自动加删除线,取消选中自动恢复。
内容的提问来源于stack exchange,提问作者nano tech
相关产品推荐
相关产品推荐

