我如何知道动态创建的 TextView 在 table 布局中的位置?
How can I tell a dynamically created TextView's position in a table layout?
我有一个 table 文本视图布局,它是我根据输入动态制作的。我想设置它,以便当用户单击 textview/box 时,它会根据该文本视图的行和列位置执行某些操作。因此,例如,如果单击的是第 (1,2) 行,则在字符串 extra 中为 1vs2 创建第二个 activity。
问题是我正在动态创建这些列和行,所以我不知道它可以有多宽,而且我不想将文本设置到它的位置,因为那应该显示那里的价值观。我唯一能想到的就是将ID设置为特定的数字。例如,12 表示第 1 行,第 2 列。但是,这就成了一个问题。如果我们做十个以上。如 (11,2) = 112,那么是第 1 行还是第 11 行?
最好的方法是什么?
它们的创建方式如下:
//add cells
for (int k = 0; k < arrFencers.size() + 5; k++) {
//get table layout count
TextView tempCell = new TextView(this);
tempCell.setClickable(true);
tempCell.setText("_");
tempCell.setBackgroundResource(R.drawable.custombb);
// tempCell.setId("");
tempCell.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//This doesn't work~~
String data = (String) parent.getItemAtPosition(position);
String[] IDs = data.split("-");
//Get names
String[] names = {arrFencers.get(Integer.parseInt(IDs[0]) - 1),
arrFencers.get(Integer.parseInt(IDs[1]) - 1)};
//setup bout Sheet data
String[] boutData = {IDs[0], names[0], IDs[1], names[1]};
//create new bout sheet
Intent bIntent = new Intent("hss.quickpool.bout");
bIntent.putExtra("boutData", boutData);
startActivityForResult(bIntent, 1);
}
});
//add to table row
newFencer.addView(tempCell);
}
每个 View
对象都有 setTag 方法来存储通用用户数据,因此它可以像这样用于视图识别目的:
class Position{
int mRow;
int mColumn;
public Position(int row, int column) {
this.mRow = row;
this.mColumn = column;
}
public int getRow() {
return mRow;
}
public int getColumn() {
return mColumn;
}
}
...
Position position = new Position(5, 10);
myTextView.setTag(position);
您可以在 table 的每个视图上使用 setTag(Object o)。
并将信息存储在该对象中。
定义一个简单的class用于存储数据:
public static class MyData{
public final int rowI;
public final int columnI;
public MyData(int row, int column) {
rowI = row;
columnI = column;
}
}
在每个单元格上设置标签:
tempcell.setTag(new MyData(i, j));
并在 onClick 中检索数据:
@Override
public void onClick(View v) {
MyData mData = (MyData) v.getTag();
if (null != mData) {
v.setText(mData.rowI.toString + "," + mData.columnI.toString);
}
}
我有一个 table 文本视图布局,它是我根据输入动态制作的。我想设置它,以便当用户单击 textview/box 时,它会根据该文本视图的行和列位置执行某些操作。因此,例如,如果单击的是第 (1,2) 行,则在字符串 extra 中为 1vs2 创建第二个 activity。
问题是我正在动态创建这些列和行,所以我不知道它可以有多宽,而且我不想将文本设置到它的位置,因为那应该显示那里的价值观。我唯一能想到的就是将ID设置为特定的数字。例如,12 表示第 1 行,第 2 列。但是,这就成了一个问题。如果我们做十个以上。如 (11,2) = 112,那么是第 1 行还是第 11 行?
最好的方法是什么?
它们的创建方式如下:
//add cells
for (int k = 0; k < arrFencers.size() + 5; k++) {
//get table layout count
TextView tempCell = new TextView(this);
tempCell.setClickable(true);
tempCell.setText("_");
tempCell.setBackgroundResource(R.drawable.custombb);
// tempCell.setId("");
tempCell.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//This doesn't work~~
String data = (String) parent.getItemAtPosition(position);
String[] IDs = data.split("-");
//Get names
String[] names = {arrFencers.get(Integer.parseInt(IDs[0]) - 1),
arrFencers.get(Integer.parseInt(IDs[1]) - 1)};
//setup bout Sheet data
String[] boutData = {IDs[0], names[0], IDs[1], names[1]};
//create new bout sheet
Intent bIntent = new Intent("hss.quickpool.bout");
bIntent.putExtra("boutData", boutData);
startActivityForResult(bIntent, 1);
}
});
//add to table row
newFencer.addView(tempCell);
}
每个 View
对象都有 setTag 方法来存储通用用户数据,因此它可以像这样用于视图识别目的:
class Position{
int mRow;
int mColumn;
public Position(int row, int column) {
this.mRow = row;
this.mColumn = column;
}
public int getRow() {
return mRow;
}
public int getColumn() {
return mColumn;
}
}
...
Position position = new Position(5, 10);
myTextView.setTag(position);
您可以在 table 的每个视图上使用 setTag(Object o)。 并将信息存储在该对象中。
定义一个简单的class用于存储数据:
public static class MyData{
public final int rowI;
public final int columnI;
public MyData(int row, int column) {
rowI = row;
columnI = column;
}
}
在每个单元格上设置标签:
tempcell.setTag(new MyData(i, j));
并在 onClick 中检索数据:
@Override
public void onClick(View v) {
MyData mData = (MyData) v.getTag();
if (null != mData) {
v.setText(mData.rowI.toString + "," + mData.columnI.toString);
}
}