以编程方式将侦听器设置为复选框数组

Setting Listeners programmatically to an array of CheckBoxes

到目前为止,我遇到了“变量 x 是在内部 class 中访问的问题,需要声明为最终的。我可以初始化 CheckBox,但无法为它们设置侦听器在循环中初始化之后。下面是我目前的代码。

for(int i=0;i<checkBox_fiber_ID.length;i++){
            int temp=getResources().getIdentifier(checkBox_fiber_ID[i],"id",getPackageName());
            checkBoxes_fiber[i]=findViewById(temp);
            checkBoxes_fiber[i].setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    if(checkBoxes_fiber[i].isChecked()){
                        //do something
                    }
                }
            });
        }

关于如何解决这个问题的任何提示?

您可以尝试创建单独的 class 监听器

 private View.OnClickListener mCheckboxListener = new View.OnClickListener() {
        public void onClick(View v) {
        if(((CheckBox)view).isChecked())
        {
        int checkBoxId = (int)v.getTag();  //You can get Id for specific checkbox
        //do other stuff with checkBoxId
       }
   }
};

并为每个复选框设置 Id,例如

for(int i=0;i<checkBox_fiber_ID.length;i++){
            int temp=getResources().getIdentifier(checkBox_fiber_ID[i],"id",getPackageName());
            checkBoxes_fiber[i]=findViewById(temp);
            checkBoxes.setTag(i); //set check box id as tag for later usage
            checkBoxes_fiber[i].setOnClickListener(mCheckboxListener);
        }

我猜您正试图根据复选框 ID 执行某些操作。您可以为复选框设置 tag 并在将来取回 tag。此外,方法 void onClick(View view) 中的 view 对象现在是一个 CheckBox。只需更改您的代码:

for(int i=0;i<checkBox_fiber_ID.length;i++){
            int temp=getResources().getIdentifier(checkBox_fiber_ID[i],"id",getPackageName());
            checkBoxes_fiber[i]=findViewById(temp);
            checkBoxes_fiber[i].setTag(i); //mark the check box id for later usage
            checkBoxes_fiber[i].setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View view) {
                    if(((CheckBox)view).isChecked()){
                        int checkBoxId = (int)view.getTag();
                        doSomething(checkBoxId);
                    }
                }
            });
        }
}

并为业务代码编写一个新方法:

public void doSomething(int no){
    if(no==1){
       //do something
    }
    else if(no==2){
       //do something
    }
    //...
}

最终字符串[] x={"defaultvalue Emptry"}

然后在 onclick 监听器内部使用下面的代码设置 x 的值。

x[0]="new value"

并在不同的函数中使用这个值。

根据你的代码,它看起来很糟糕:

final String x[] ={""}
for(int i=0;i<checkBox_fiber_ID.length;i++){
        int temp=getResources().getIdentifier(checkBox_fiber_ID[i],"id",getPackageName());
        checkBoxes_fiber[i]=findViewById(temp);
        checkBoxes_fiber[i].setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                if(checkBoxes_fiber[i].isChecked()){
                   x[0]=checkBoxes_fiber[i].getvalue==> value name
                }
            }
        });
    }

外部函数使用

获取x的值
String name=x[0]