作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,当我遍历我的按钮数组列表时,我试图设置它们的所有 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% 地工作,我不明白为什么它必须是最终的。
我已经找到了其他方法来使用其他方法遍历数组列表,但这让我很烦。
最佳答案
让我们退后一步,看看这里发生了什么:
现在,这里要记住的重要一点是内部类的方法将在未定义 以后调用。因此其中包含的方法与当前的执行流程是分开的。现在想象以下代码:
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/
我是一名优秀的程序员,十分优秀!