Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.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
Java 如何引用xml文件中尚未创建的视图?_Java_Android_Eclipse_Android Layout - Fatal编程技术网

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
    }
}