在动态编程期间,如何使 EditText 适合 Java 中的 Table 单元格?

How do I fit an EditText to a Table Cell in Java during dynamic programming?

问题: 我很难让 EditText 字段适应 table 单元格尺寸。

我尝试过的方法: 我已经尝试了很多建议,例如下面我的代码,在 Whosebug 上有说明,但几乎所有的都是静态的而不是动态的例子。我看了几个差不多的视频。

我正在尝试做的事情:我正在尝试为用户提供一个选项,将一行数据添加到 table 并填写领域。下面的代码运行良好,除了我似乎无法找到正确的方法来说明 LayoutParams 以适应单元格边界内的 EditText

for(int r=1; r<5;r++) {
   EditText editText = new EditText(this);
   editText.setBackgroundColor(Color.WHITE);
   editText.setTextSize(12);
   editText.setSingleLine();
   editText.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
   row.addView(editText);
}

<TableLayout
      android:id="@+id/table_authors"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:orientation="vertical"
      android:background="@color/colorDkGray"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintTop_toBottomOf="@id/btn_add_author"
      android:layout_marginTop="15dp"
      android:layout_marginEnd="5dp"
      android:layout_marginStart="5dp"/>

EditNote activity 中设置 table 的代码:

tableLayoutAuthors = findViewById(R.id.table_authors);
        tableLayoutAuthors.addView(setupAuthorsTableRow("+", "Organization/First", "Middle Name", "Last Name","Suffix", true));

btnAddAuthor.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tableLayoutAuthors.addView(setupAuthorsTableRow("-","", "", "", "", false));
            }
        });

您需要做一些调整:

  1. 在xmlTableLayout中添加android:stretchColumns="*",表示拉伸所有列。

     <TableLayout
         android:id="@+id/table_authors"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginStart="5dp"
         android:layout_marginTop="15dp"
         android:layout_marginEnd="5dp"
         android:layout_marginBottom="716dp"
         android:orientation="vertical"
         android:stretchColumns="*"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
    
  2. 您需要将 editText 宽度设置为 0。因为使用 WRAP_CONTENT 它会考虑必须换行的内容宽度,而不是单元格边界。

示例代码如下所示:

TableLayout tableLayoutAuthors  = findViewById(R.id.table_authors);
        TableRow row = new TableRow(this);
        for (int r = 1; r < 5; r++) {
            EditText editText = new EditText(this);
            editText.setBackgroundColor(Color.WHITE);
            editText.setTextSize(12);
            editText.setText("test");
            editText.setSingleLine();
            editText.setLayoutParams(new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT));
            row.addView(editText);
        }
        tableLayoutAuthors .addView(row);

在 Mayur Gajra 的帮助下,我找到了解决问题的方法。下面发布的内容解决了我的问题:

将此行添加到 XML:

android:stretchColumns="*"

更改为创建 TableRow.LayoutParams 的实例并为 editText 设置边距和填充:

    for(int r=1; r<5;r++) {
          EditText editText = new EditText(this);
 // Change:   
          TableRow.LayoutParams trLayoutParams = new TableRow.LayoutParams();
          trLayoutParams.setMargins(3,3,3,3);
          editText.setLayoutParams(trLayoutParams);
    
          editText.setBackgroundColor(Color.WHITE);
          editText.setTextSize(12);
          editText.setGravity(Gravity.CENTER);
          editText.setSingleLine();

   // Change: 
          editText.setPadding(8, 8, 8, 8);
    
          row.addView(editText);
          row.setClickable(true);
      }