2

我正在创建一个带有动态自定义表格行的表格。我需要在活动类中获取 id。

main_Activity-->MyTableLayoutView-->MyTableRow

我的问题是,如何将在表格(TextViews)中单击的单元格的 id 获取到 main_Activiy。

MyTableRowView:

    public void addRow(String[] data, int[] rowId) {
    for (int i = 0; i < data.length; i++) {
        TextView tv = parseTextView(data[i]);
        tv.setId(rowId[i]);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView tv2 = (TextView) v;
                clickedText = tv2.getText().toString();
                Debug.debugMsg(clickedText + " " + tv2.getId());
            }
        });
        this.addView(tv);
    }
}

据我所知,是从 TablerowView 类中获取 id,但我需要它在 Activity 类中,请如果有人能启发我。提前致谢。

活动类:

    private void showTables() {
    db.open();
    db.importDb();// TODO
    table = new TableLayoutView(this,Converter.toArrayListStringArray(db.getDbTablesForChoose()));
    table.addDataListArray(Converter.toArrayListStringArray(db.getDbTablesForChoose()),true);
    llChooseSQLTable.addView(table);
}

表格布局视图:

    public void addDataListArray(ArrayList<String[]> data, boolean header) {

    for (int i = 0; i < ROW_NUMBERS; i++) {
        TableRowView tableRow = new TableRowView(context);

        tableRow.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        tableRow.addRow(data.get(i),idHandler.getNextIdsRow());//idHandles passes unique id.
        this.addView(tableRow); 
    }
}
4

2 回答 2

1

您似乎可以从上面的代码中获取 ID。如果您主要关心的是将该 id 从视图传播回父类,那么您可以通过多种方式进行。一种方法是获取视图的上下文,然后将其转换为特定的活动并在该活动中调用一个函数,例如在 onClick() 操作中:

public void onClick(View v) {
  ((MyActivity)v.getContext()).insertNotificationMethod(v.getId());
}

您的活动称为 MyActivity 并且您实现了一个名为 insertNotificationmethod 的方法,该方法采用整数。只有当这个视图总是在这个函数中时,这才有效,即使这样,它也是一种相当粗糙的方法。

你也可以直接在 onClick() 方法中调用它,使用:

MyActivity.this.insertNotificationMethod(v.getId());

但是,这种做事方式会将这种观点限制为仅在此特定活动中有用。

对于更通用的方式,您可以使用 BroadcastReceivers ,这可能会比您想要的更复杂一些。有关这些的更多信息,您可以在此处查看 Android 文档:http: //developer.android.com/reference/android/content/BroadcastReceiver.html

希望这会有所帮助。

于 2012-08-30T22:18:46.003 回答
0

我能想到的唯一解决方案是将您的方法addRow()addDataListArray()方法移至 Activity并进行一些修改

public void addRow(String[] data, int[] rowId, TableRowView tableRow) {
for (int i = 0; i < data.length; i++) {
    TextView tv = parseTextView(data[i]);
    tv.setId(rowId[i]);
    tv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            TextView tv2 = (TextView) v;
            clickedText = tv2.getText().toString();
            clickedId = tv2.getId());
        }
    });
    tableRow.addView(tv);
}
}

public void addDataListArray(ArrayList<String[]> data, boolean header, TableLayoutView table) {

for (int i = 0; i < ROW_NUMBERS; i++) {
    TableRowView tableRow = new TableRowView(context);

    tableRow.setLayoutParams(new LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    addRow(data.get(i),idHandler.getNextIdsRow(), tableRow);//idHandles passes unique id.
    table.addView(tableRow); 
}
}

在您的活动中更改此行:

//table.addDataListArray(Converter.toArrayListStringArray(db.getDbTablesForChoose()),true);
addDataListArray(Converter.toArrayListStringArray(db.getDbTablesForChoose()),true, table);

虽然我不知道你的应用程序的其他部分是否会受到我所做的巨大修改的影响。

祝你好运!

于 2012-08-30T22:25:15.767 回答