Java 如何引用xml文件中尚未创建的视图?
//首先我有这个方法,下面是我的问题Java 如何引用xml文件中尚未创建的视图?,java,android,eclipse,android-layout,Java,Android,Eclipse,Android Layout,//首先我有这个方法,下面是我的问题 public void addrows(){ TableRow fila; tabla = (TableLayout)findViewById(R.id.tabla); TextView txtNombre; for(int i = 0;i<id;i++){ String x[] = helper.leer(); layoutFila = new TableRow.
public void addrows(){
TableRow fila;
tabla = (TableLayout)findViewById(R.id.tabla);
TextView txtNombre;
for(int i = 0;i<id;i++){
String x[] = helper.leer();
layoutFila = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,
TableRow.LayoutParams.WRAP_CONTENT);
caja= new CheckBox(this);
fila = new TableRow(this);
fila.setLayoutParams(layoutFila);
txtNombre = new TextView(this);
txtNombre.setId(i);
txtNombre.setTextSize(17);
txtNombre.setText(x[i]);
txtNombre.setGravity(Gravity.LEFT);
// txtNombre.setLayoutParams(layoutTexto);
caja.setText("");
caja.setId(i);
fila.addView(txtNombre);
fila.addView(caja);
tabla.addView(fila);
}
}
public void addrows(){
TableRow fila;
tabla=(TableLayout)findviewbyd(R.id.tabla);
TextView txtNombre;
对于(inti=0;i,正如您在类文档中看到的那样,在您搜索的树中,ID应该是唯一的
您为TextView和复选框设置了相同的id
如果您知道稍后将在创建之后访问它们,请在数组中保留对它们的引用,而不是稍后尝试使用findViewById检索它们
但更好的解决方案是为它们设置onClick事件监听器,并跟踪检查/取消选中它们
在@HalR的回答中,您可以阅读如何为您的复选框设置onCheckedChanged事件侦听器。下面他的解决方案将有一个复选框的ArrayList
下一步,您必须增加正确TextView的值,因此需要将复选框和TextView耦合起来
我认为最好的方法是为复选框设置标签,值为TextView id
所以,在用户提交后,您迭代检查复选框列表,获取标记并在findViewById中使用它来获取TextView并更新其值
Id(标识符的缩写)是唯一标识元素的整数,您可以在findViewById中使用它来获取视图元素
标记用于将视图元素与您可能读入的一些额外数据相关联。它作为参数对象类型,因此您可以将任何内容设置为标记,而不仅仅是数字。在您的情况下,您可以将文本视图而不是其id设置为ChechBox的标记,它也可以工作。您正在手动将id设置为行的索引,这是我不知道的我想我会的。我通常会使用setTag()
来识别我的对象
我认为使用侦听器来检测复选框何时被选中会更容易,并且您可以在选中时跟踪更改
使用类似以下内容:
int textBoxListSize = checkBoxList.size();
for(int i = 0; i < textBoxListSize; ++i){
CheckBox checkBox = checkBoxList.get(i);
if(chechkBox.isChecked()){
TextView textView = (TextView)checkBox.getTag();
//do whatever with textView
}
}
在活动中,创建ArrayList
ArrayList<CheckBox> checkedBoxes = new ArrayList<CheckBox>();
关于Id和标签的一些信息
Id是一个数字值,用于标识视图层次结构中的视图。如果您在布局中使用某些东西,例如将一个视图与另一个视图对齐,则它们会查找并期望具有特定Id的视图。因此,在布局中,您将有android:Id=“@+Id/bigBox”
这将创建一些它与bigBox关联的数字。当您找到该视图时,使用findViewById()
这就是它正在查找的数字。当您手动设置这些数字时,似乎是在自找麻烦。如果您将视图的id设置为2,那么您应该能够使用myView=findViewById]找到它(2)
标记是一个很好的小对象指针,可以随视图一起传递。它通常是一个行号:
Integer saveMe = new Integer(i);
checkBox.setTag(saveMe);
或者它甚至可以是指向用于创建该行的原始数据对象的指针
myRow.setTag(联系人)
稍后,当您单击该行时,您只需使用
contact=(contact)myRow.getTag()
你可以恢复你原来的联系方式。这比保持你的行或复选框的大数组更干净。只要使用侦听器来检测你做什么,这是一种更好的方法
哦,如果您确实有一个由复选框触发的onClick(View View)
,那么该视图就是您的复选框
CheckBox theBoxIJustChecked = (CheckBox)view;
您不需要使用某个id来查找它。它就在那里。如果您想这样做,您只需执行相应的操作,即:
for(int i = 0; i < n; ++i){
...
...(CheckBox))this.findViewById(i);
...
}
然后你应该用这个函数设置文本视图的id
checkBox.setId(i);
textView.setId(getTextVieIdByCheckBoxId(i));
....
// add Views to your layout
....
(CheckBox)this.findViewById(i);
TextView)this.findViewById(getTextVieIdByCheckBoxId(i));
或
2.我认为有一种更准确的方法:
只需使用复选框实例的setTag(),在内部设置Approverate TextView,即可创建互连。在这种情况下,您必须将所有创建的复选框存储在某个列表或数组中:
List<CheckBox> checkBoxList = new ArrayList<CheckBox>();
for(int i = 0; i < n; ++i){
...
CheckBox checkBox = new CheckBox();
TextView textView = new TextView();
checkBox.setTag(textView);
checkBoxList.add(checkBox);
}
List checkBoxList=new ArrayList();
对于(int i=0;i
然后你可以像这样实现你想要的:
int textBoxListSize = checkBoxList.size();
for(int i = 0; i < textBoxListSize; ++i){
CheckBox checkBox = checkBoxList.get(i);
if(chechkBox.isChecked()){
TextView textView = (TextView)checkBox.getTag();
//do whatever with textView
}
}
int textBoxListSize=checkBoxList.size();
对于(int i=0;i
在这里,您不需要生成id,也不需要担心可能会发生冲突的情况如果选中要压缩的对象,为什么要知道它们的id?此外,为了java的良好实践,addrows应该改为addrows。感谢帮助:),但这正是我试图做的:首先,我有一个tableview,根据用户的输入,它将填充一个名称和一个复选框,因此假设用户添加了两个名称,因此在我的数据库中将有两行,列名称(text)和列名(int),因此当用户进入mainActivity时,表布局将有两个textview和两个复选框(我需要id的那些)如果用户选中2个复选框,然后单击我创建的按钮,应用程序必须向字段asist添加1,这取决于选中的复选框,可能只有2个,如本例或更多,因此我需要立即检索选中复选框的所有信息(Hi Gustek:)!谢谢你的帮助,我想我最不需要的是我给halR提的同一个问题,但如果你也愿意回答,我将非常感谢你。看:setTag()和setId()之间有什么区别?你如何检索标记?例如,对于id是:txtNombres=(TextView)findViewById(j);非常感谢您,再次为我的英语XD感到抱歉!谢谢,这是我到目前为止所拥有的:public void pasarlista(View args1){for(int j=0;jexcuse me,我几乎能理解,所以让我
int textBoxListSize = checkBoxList.size();
for(int i = 0; i < textBoxListSize; ++i){
CheckBox checkBox = checkBoxList.get(i);
if(chechkBox.isChecked()){
TextView textView = (TextView)checkBox.getTag();
//do whatever with textView
}
}