gpt4 book ai didi

android - 当使用 foreach 循环遍历 arraylist 不使实例成为最终实例时,是否有解决方法?

转载 作者:行者123 更新时间:2023-11-29 21:37:12 25 4
gpt4 key购买 nike

因此,当我遍历我的按钮数组列表时,我试图设置它们的所有 onClickedListener()/onFocusChangedListener() 但是当涉及到修改数组列表中的按钮时,它告诉我它必须是决赛。

代码:

        for(Button aBtn : menu_Buttons)
{
aBtn.setOnFocusChangeListener(new OnFocusChangeListener(){

@Override
public void onFocusChange(View arg0, boolean changed) {
Log.i("LC", "focus changed");
if(changed)
{
aBtn.setTextColor(Color.parseColor("#FFFFFF"));
Log.i("LC", "true");
}
else
{
aBtn.setTextColor(Color.parseColor("#CD6839"));
Log.i("LC", "false");
}
}
});
}

所以它要求它变成这样。

for(final Button aBtn : menu_Buttons)

谁能给我解释一下,我现在还没有 100% 地工作,我不明白为什么它必须是最终的。

我已经找到了其他方法来使用其他方法遍历数组列表,但这让我很烦。

最佳答案

让我们退后一步,看看这里发生了什么:

  1. 你有一个实例变量(Button aBtn)
  2. 您正在内部类中引用此实例变量 (new OnFocusChangeListener(){...})

现在,这里要记住的重要一点是内部类的方法将在未定义 以后调用。因此其中包含的方法与当前的执行流程是分开的。现在想象以下代码:

   for(Button aBtn : menu_Buttons)
{
aBtn.setOnFocusChangeListener(new OnFocusChangeListener(){

@Override
public void onFocusChange(View arg0, boolean changed) {
Log.i("LC", "focus changed");
if(changed)
{
aBtn.setTextColor(Color.parseColor("#FFFFFF"));
Log.i("LC", "true");
}
else
{
aBtn.setTextColor(Color.parseColor("#CD6839"));
Log.i("LC", "false");
}
}
});

if(someCondition) {
aBtn = someOtherButton;
}
}

在这种情况下,aBtn 发生了变化,那么当调用其中一个方法时,内部类应该使用哪个 Button 实例?无论编译器选择哪一种,都必然会给程序员带来歧义,这反过来又很容易成为微妙且难以追踪的错误的来源。

通过对内部类中引用的实例变量强制执行 final,编译器消除了这种歧义,使编写正确的程序变得更加容易。

关于android - 当使用 foreach 循环遍历 arraylist 不使实例成为最终实例时,是否有解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com