2

//首先我有这个方法,下面是我的问题

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

我知道当 oncreate() 方法启动时,复选框对象被创建,然后我将一个数字 id 从 0 分配到 for 循环停止的任何地方,但稍后在程序中我需要检索单击了哪些复选框,所以首先我需要 id但是eclipse不会让我输入数字ID,请帮忙!对不起我的英语我是安卓和英语的菜鸟

this.CheckBox = (CheckBox)this.findViewById(R.id.?);

4

3 回答 3

1

正如您可能在查看类文档中看到的那样,ID 在您搜索的树中应该是唯一的。

您为 TextView 和 Checkbox 设置相同的 id。

如果您知道您将在创建后访问它们,请在数组中保留对它们的引用,而不是稍后尝试使用 findViewById 检索它们。

但更好的解决方案是为它们设置 onClick 事件侦听器并跟踪检查/取消选中它们。

在@HalR 的回答中,您可以阅读如何为您的复选框设置 onCheckedChanged 事件侦听器。遵循他的解决方案将有一个选中复选框的 ArrayList。

下一步,您必须增加正确 TextView 的值,因此您需要耦合 CheckBoxes 和 TextViews。

我认为最好的方法是为 CheckBox 设置标签,其值为 TextView id。

因此,在用户提交后,您遍历复选框列表,getTag 并在 findViewById 中使用它来获取 TextView 并更新其值。

Id(IDentifier 的缩写)是一个整数,用于唯一标识元素,可以在 findViewById 中使用它来获取视图元素。您可以在此答案中阅读有关 ID 的更多信息

Tag 用于将 View 元素与一些额外的数据相关联,您可以在getTag 文档中阅读。它需要作为参数对象类型,因此您可以将任何内容设置为标签,而不仅仅是数字。在您的情况下,您可以将 TextView 而不是其 id 设置为 ChechBox 的标签,它也可以工作。

于 2013-04-27T22:45:19.617 回答
0

如果你想这样做,那么你应该做适当的操作,即:

for(int i = 0; i < n; ++i){
    ...
    ...(CheckBox))this.findViewById(i);
    ...
}

它应该适合你

但是请注意,如果您在视图树中有多个具有相同 id 的视图,而不是findViewById(i)可能会返回意外结果,例如返回具有给定 id 的视图树中的第一个视图(它可以不是 CheckBox 类型这可能导致 ClassCAstException)

更新回复评论

如果你想建立某种逻辑连接 CheckBox-TextView 有几个选项:

  1. 您可以制作如下功能(假设 CheckBoxes 和 TextViews 数量有限制):

代码:

private static int CHECK_BOX_MAX_NUMBER = 10000;

public void int getTextVieIdByCheckBoxId(int checkBoxId){
    if(checkBoxId >= CHECK_BOX_MAX_NUMBER){
        // you can throw an exception here for example
    }
    return CHECK_BOX_MAX_NUMBER  + checkBoxId;
}

然后您应该使用该功能将 id 设置为您的 TextViews。

checkBox.setId(i);
textView.setId(getTextVieIdByCheckBoxId(i));
....
// add Views to your layout
....
(CheckBox)this.findViewById(i);
TextView)this.findViewById(getTextVieIdByCheckBoxId(i));

或者

2.我认为有一个更准确的方法:只需使用CheckBox 实例的setTag()在内部设置适当的 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);

}

然后你可以像这样实现你想要的:

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

在这里,您无需生成 id 并担心可能会发生的冲突

于 2013-04-27T23:21:23.957 回答
0

您正在手动将您的 id 设置为行的索引,这是我认为我不会做的事情。我通常会setTag()用来识别我的对象。

我认为使用侦听器来检测复选框何时被选中会更容易,并且您可以在检查发生时跟踪更改。

使用这样的东西:

在您的活动中,创建一个 ArrayList

ArrayList<CheckBox> checkedBoxes = new ArrayList<CheckBox>();

然后在您的创作中:

caja= new CheckBox(this);

caja.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

   @Override
   public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
        int index = buttonView.getId();//pulling back the number you set originally, if that is what you like.  I would get the tag I had set, and maybe do something here.
        //do something in here!
        if (buttonView.isChecked()) {
            //including this checkbox in the list of checked boxes
            checkedBoxes.addObject(buttonView);
        } else {
            //take it out of the list of checked boxes
            checkedBoxes.removeObject(buttonView);
        }
   }
};

关于 Id vs Tag 的一些信息

Id 是一个数值,用于标识视图层次结构中的视图。如果你在你的布局中使用了一些东西,比如将一个视图与另一个对齐,他们会寻找并期望一个具有特定 id 的视图。因此,在布局中,您将拥有android:id="@+id/bigBox"并将创建一些与 bigBox 相关联的数字。当您找到该视图时,findViewById()这就是它正在寻找的数字。当您手动设置这些数字时,似乎您是在自找麻烦。如果您将视图的 id 设置为 2,那么您应该可以使用myView = findViewById(2).

Tag 是一个非常小的对象指针,您可以将其与视图一起传递。很多时候它将是一个行号:

  Integer saveMe = new Integer(i);
  checkBox.setTag(saveMe);

或者它甚至可以是指向您用于创建该行的原始数据对象的指针。如果您使用联系人创建了每一行,则可以使用

myRow.setTag(contact)

稍后当您单击该行时,您只需使用

contact = (Contact)myRow.getTag()

你会得到你原来的联系方式。它比保留大量行或复选框或其他任何东西更干净。只需使用侦听器来检测您何时执行某项操作,这是一种更好的方法。

哦,如果您确实有一个onClick(View view)由您的 CheckBox 触发的,那么该视图就是您的 CheckBox。

CheckBox theBoxIJustChecked = (CheckBox)view;

你不需要用一些 id 来查找它。它就在那里。

于 2013-04-27T22:46:18.713 回答