以编程方式将侦听器设置为复选框数组
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]
到目前为止,我遇到了“变量 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]