ID属性在使用Titanium的Android设备上返回null

时间:2014-11-24 21:27:37

标签: android titanium titanium-mobile titanium-alloy

我搜索了SO和其他人找到了徒劳的解决方案。我使用ID为TableView的XML创建了table并动态填充(通过在其中创建多个TableViewRowsTextFields)。

问题如下:当我尝试使用$.table.add(row)以编程方式添加所有已创建的项目时,我在浏览器上获得了预期结果,但在Android 设备上有NullPointerException

我在代码中进行了一些测试,以查看返回null的内容,发现ID属性$.table是问题所在。 Android中会发生什么以及如何解决它?

mytable.xml:

<Alloy>
    <Window id="win_container">
        <View id="wrapper">
            <!-- The TableView -->
            <TableView id="table" />
        </View>
    </Window>
</Alloy>

mytable.js:

for (...) {
    // create TableViewRows
    row = Ti.UI.createTableViewRow ({
        className: "row",
        ...
    });

    // create several TextFields in one TableViewRow
    for (...) {
        tf = Ti.UI.createTextField ({
            ...
        });
        // add TextFields to the TableViewRow
        row.add(tf);
    }

    // add TableViewRows to table
    $.table.add(row);    ///  <----- '$.table' returns 'null'
}

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

IMO错误是因为您使用add方法在表中添加行。

要向tableView添加行,您可以使用以下两种方法:

  1. 使用tableView的{​​{3}}方法:将$.table.add(row);替换为$.table.appendRow(row);

  2. 推送数组中的所有行,然后使用appendRow方法将其添加到tableView。您的代码将类似于:

    var dataRows = [];
    for (...) {
      // create TableViewRows
      row = Ti.UI.createTableViewRow ({
        className: "row",
        ...
      });
    
      // create several TextFields in one TableViewRow
      for (...) {
        tf = Ti.UI.createTextField ({
         ...
        });
        // add TextFields to the TableViewRow
        row.add(tf);
      }
    
      dataRows.push(row);
    }
    
    // add TableViewRows to table
    $.table.setData(dataRows);
    
  3. 希望它有所帮助。

答案 1 :(得分:0)

这可能是“在黑暗中拍摄” - 但我遇到了一个名为“私人”的问题。我不得不将我的id重命名为“isPrivate” - 所以我猜其中一些不能是“保留名称”。我没有检查过 - 只是通过快速反复试验找到了。但也许“桌子”是一个类似的保留字?