Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在TableLayout中移动TableRow时出现问题_Android_Android Layout_Tablelayout - Fatal编程技术网

Android 在TableLayout中移动TableRow时出现问题

Android 在TableLayout中移动TableRow时出现问题,android,android-layout,tablelayout,Android,Android Layout,Tablelayout,我试图根据用户输入在特定视图中同时动态移动几行 用例是用户选择一个选项,并基于该选项,显示/隐藏某些行,并且需要重新排列这些行,以便用户理解 TableLayout在XML中实例化,但是TableRow及其布局在代码中实例化。我尝试了几种不同的方法,取得了不同程度的成功 用于正确隐藏/禁用的代码: private void updateTimeRow(TargetType goalTarget) { TableRow timeRow = (TableRow)this.findViewBy

我试图根据用户输入在特定视图中同时动态移动几行

用例是用户选择一个选项,并基于该选项,显示/隐藏某些行,并且需要重新排列这些行,以便用户理解

TableLayout
XML
中实例化,但是
TableRow
及其布局在代码中实例化。我尝试了几种不同的方法,取得了不同程度的成功

用于正确隐藏/禁用的代码:

private void updateTimeRow(TargetType goalTarget)
{
    TableRow timeRow = (TableRow)this.findViewById(timeId + 100);
    EditText timeText = (EditText)this.findViewById(timeId);
    if (goalTarget == TargetType.daysRowedWeek
            || goalTarget == TargetType.metersDay
            || goalTarget == TargetType.metersSeason
            || goalTarget == TargetType.metersWeek)
    {
        timeRow.setVisibility(View.GONE);
        timeRow.setEnabled(false);
        timeText.setEnabled(false);
    }
    else if (goalTarget == TargetType.splitForDistance
            || goalTarget == TargetType.unknown)
    {
        setTimeText(currentTarget.recalcTime().toString());
        timeRow.setVisibility(View.VISIBLE);
        timeRow.setEnabled(false);
        timeText.setEnabled(false);
    }
    else
    {
        timeRow.setVisibility(View.VISIBLE);
        timeRow.setEnabled(true);
        timeText.setEnabled(true);
    }
}    
根据这里回答的问题,我尝试删除/重新添加行,代码如下:

    int rowNum = -1;
    tableLayout.removeView(timeRow);
    switch (goalTarget)
    {
    case unknown:
    case timeForDistance:
        rowNum = 2;
        break;
    case splitForDistance:
        rowNum = 4;
        break;
    case splitForTime:
        rowNum = 3;
        break;
    }
    tableLayout.addView(timeRow, rowNum);
这里有两个问题:

  • 禁用代码失败(该代码是否在上述启用/禁用代码之前或之后运行
  • 我布局中的行都搞砸了

那么,如何在正确隐藏/显示/启用/禁用不同行的同时动态移动行?

经过大量令人沮丧的尝试和错误后,我终于找到了实现这一点的唯一方法,并获得了可靠的结果:

我必须调整我的UI更新方式,将其分为三个步骤: -更新输入值(强制格式化、重新计算等) -重新布置行 -根据选择启用/禁用不同的输入

螺母和螺栓是,每当
目标更改时,我必须从
表格布局中删除所有
表格行
并添加

将它们按正确的顺序返回,并将适当的行号作为
addView()
调用的一部分

这绝对不是我所能看到的最漂亮的方式,但显然
表格布局不喜欢你只是尝试一下

一次移动一个物体