如何以编程方式调整 TableLayout 中的 TableRow 单元格宽度?

How do I adjust TableRow cell widths within a TableLayout programmaticallly?

问题: 当我 select 一个具有长路径或名称的文件时,它强制相邻的列消失。

布局 xml 只是将 TableLayout 定位为 Activity 中的占位符,Java 代码用于根据需要创建 `TableRows 和视图。

我正在尝试做的事情: 用户可以单击“添加”按钮来 select 添加他们 phone 上的文件作为 TableLayoutTableRow 的路径和文件名。第一列有一个按钮( - )可选择删除新添加的 TableRow,第二列包含路径和文件名。

我尝试了什么: 我觉得我已经尝试了所有以编程方式调整各种 LayoutParamsButtonTextView 宽度和设置固定宽度的高度参数......至少对于按钮。但似乎没有任何效果。当我在这里搜索编程示例时,它总是布局 XML 代码,而不是 Java.

我仍在学习 Android,但我一直坚持这一点,并认为有人可以为我指明正确的方向。下面是一些图像和在其中创建 TableRows 和视图的代码。感觉有点傻我想不通。

添加前

添加后

单例 class 中的代码 方法创建 ButtonTextView 视图到 TableRowTableLayout。第一个方法调用另外两个创建 Button 和 TextView

public static TableRow setupFilesTableRow(Context context, TableLayout table, String fileID, String fileName, boolean header) {
        TableRow row = new TableRow(context);
        if(header) {
            row.addView(setupFilesAddRowButton(context, table));
            row.addView(addRowTextViewToTable(context, fileName, true));
        }else{
            row.addView(setupDeleteRowButton(context, table));

            for(int r=1; r < 2; r++){
                
                row.addView(addRowTextViewToTable(context, fileName, false));
                row.setClickable(true);
            }
        }
        return row;
    }

public static Button setupDeleteRowButton(Context context, TableLayout table){
        Button btnDelete = new Button(context);
        TableRow.LayoutParams trLayoutParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT);
        trLayoutParams.setMargins(3,3,3,3);
        btnDelete.setBackgroundColor(Color.WHITE);
        btnDelete.setLayoutParams(trLayoutParams);
        btnDelete.setText("-");
        btnDelete.setTypeface(Typeface.DEFAULT,Typeface.BOLD);
        btnDelete.setGravity(Gravity.CENTER);
        btnDelete.setPadding(5,5,5,5);
        btnDelete.setOnClickListener(v -> {
            deleteTableRows(table);
        });
        return btnDelete;
    }

public static TextView addRowTextViewToTable(Context context, String value, boolean bold){

        TextView tv;
        tv = new TextView(context);
        TableRow.LayoutParams trLayoutParams = new TableRow.LayoutParams();

        trLayoutParams.setMargins(3,3,3,3);
        tv.setText(String.valueOf(value));
        if(bold) tv.setTypeface(null, Typeface.BOLD);
        tv.setLayoutParams(trLayoutParams);
        tv.setTextSize(12);
        tv.setGravity(Gravity.CENTER);
        tv.setPadding(8,8,8,8);
        tv.setBackgroundColor(Color.WHITE);

        return tv;
    }

在我学会使用术语“动态”而不是“程序化”之后,我找到了一些帮助,结果解决了我的问题。以下 link 为我推断问题的解决方案提供了依据。 link下面是我对这个问题的回答。

灵感来源: http://mangoprojects.info/android-2/creating-a-tablelayout-dynamically-in-android/

解决方法:我在TableRow的声明处申请LayoutParams失败了。添加这些参数后,我可以使用 TableRow.LayoutParams 来帮助定义和控制单独的 ButtonTextViews,在我的特定情况下使用 .weight.height 参数。查看更新后的代码和结果图片。

代码更新的可视化结果

代码更新为 setupFilesTableRow

    TableRow row = new TableRow(context);
    LinearLayout.LayoutParams ll = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT);
    row.setLayoutParams(ll);

setupDeleteRowButton 的代码更新(添加体重和身高有帮助)

    Button btnDelete = new Button(context);
    TableRow.LayoutParams trLayoutParams = new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT);
    trLayoutParams.setMargins(3,3,3,3);
    trLayoutParams.weight = 1;
    trLayoutParams.height =75;
    btnDelete.setLayoutParams(trLayoutParams);

代码更新为 addRowTextViewToTable*

    TextView tv;
    tv = new TextView(context);
    TableRow.LayoutParams trLayoutParams = new TableRow.LayoutParams(0, TableRow.LayoutParams.MATCH_PARENT);
    trLayoutParams.setMargins(3,3,3,3);
    trLayoutParams.weight = 5;
    tv.setLayoutParams(trLayoutParams);