Android 无法在其他方法中定义的内部类中引用非最终变量l
我试图在我的Android应用程序中为一些元素设置一个Android 无法在其他方法中定义的内部类中引用非最终变量l,android,iteration,onclicklistener,Android,Iteration,Onclicklistener,我试图在我的Android应用程序中为一些元素设置一个OnClickListener,这些元素是动态定义的,没有给出ids,但它们被放在LinearLayouts的列表中,该列表存在于LinearLayouts中,因此我将OnClickListener设置如下: List<LinearLayout> inner_ver = setElemets(1); for (LinearLayout l: inner_ver){ l.get
OnClickListener
,这些元素是动态定义的,没有给出id
s,但它们被放在LinearLayouts
的列表中,该列表存在于LinearLayouts
中,因此我将OnClickListener
设置如下:
List<LinearLayout> inner_ver = setElemets(1);
for (LinearLayout l: inner_ver){
l.getChildAt(0).setOnClickListener(new OnClickListener() { // here's the syntax error
@Override
public void onClick(View v) {
l.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
}
});
}
List-internal\u-ver=setElemets(1);
用于(线性布局l:内部版本){
l、 getChildAt(0).setOnClickListener(新的OnClickListener(){//以下是语法错误
@凌驾
公共void onClick(视图v){
l、 getChildAt(1).挫折背景资源(R.drawable.home_curtopen);
}
});
}
但是我得到了标题中提到的l
的语法错误,我不能仅仅将其声明为final
,因为它只将更改分配给列表中的最后一个元素
拆分为一个单独的方法:
for (LinearLayout l: inner_ver){
assignListener(l);
}
public void assignListener(final LinearLayout l) {
l.getChildAt(0).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
l.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
}
});
}
分为单独的方法:
for (LinearLayout l: inner_ver){
assignListener(l);
}
public void assignListener(final LinearLayout l) {
l.getChildAt(0).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
l.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
}
});
}
您还可以创建自己的OnClickListener类:
class MyOnClickListener implements OnClickListener{
private LinearLayout layout;
public MyOnClickListener(LinearLayout layout){
this.layout = layout;
}
@Override
public void onClick(View v) {
layout.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
}
}
然后将循环更改为:
for (LinearLayout l: inner_ver){
l.getChildAt(0).setOnClickListener(new MyOnClickListener(l));
}
您还可以创建自己的OnClickListener类:
class MyOnClickListener implements OnClickListener{
private LinearLayout layout;
public MyOnClickListener(LinearLayout layout){
this.layout = layout;
}
@Override
public void onClick(View v) {
layout.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
}
}
然后将循环更改为:
for (LinearLayout l: inner_ver){
l.getChildAt(0).setOnClickListener(new MyOnClickListener(l));
}
您可以将final
添加到for循环中
List<LinearLayout> inner_ver = setElemets(1);
for (final LinearLayout l: inner_ver){
l.getChildAt(0).setOnClickListener(new OnClickListener() { // here's the syntax error
@Override
public void onClick(View v) {
l.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
}
});
}
List-internal\u-ver=setElemets(1);
用于(最终线性布局l:内部版本){
l、 getChildAt(0).setOnClickListener(新的OnClickListener(){//以下是语法错误
@凌驾
公共void onClick(视图v){
l、 getChildAt(1).挫折背景资源(R.drawable.home_curtopen);
}
});
}
中解释了为什么for(最终类型名称:Iterable)
有效
您可以将final
添加到for循环中
List<LinearLayout> inner_ver = setElemets(1);
for (final LinearLayout l: inner_ver){
l.getChildAt(0).setOnClickListener(new OnClickListener() { // here's the syntax error
@Override
public void onClick(View v) {
l.getChildAt(1).setBackgroundResource(R.drawable.home_curtopen);
}
});
}
List-internal\u-ver=setElemets(1);
用于(最终线性布局l:内部版本){
l、 getChildAt(0).setOnClickListener(新的OnClickListener(){//以下是语法错误
@凌驾
公共void onClick(视图v){
l、 getChildAt(1).挫折背景资源(R.drawable.home_curtopen);
}
});
}
中解释了为什么for(最终类型名称:Iterable)
有效
它还只是处理列表中最后一个似乎不正确的布局。您的代码中的其他地方可能有错误吗?布局L分别适用于循环中的每个迭代。你是对的,我还有另一个错误,但在更正后,你的方式与meit配合得很好。它还处理列表中最后一个似乎不正确的布局。您的代码中的其他地方可能有错误吗?布局L分别适用于循环中的每个迭代。你是对的,我还有另一个错误,但在更正后,你的方式与我配合得很好。他说这仍然只分配了最后循环迭代的单击,但考虑到他也不喜欢我的答案,我认为你的是正确的,他在代码的其他地方有一个逻辑错误。@GregEnnis很可能l.getChildAt(0)
可能一直都是同一件事。你的观点也是对的,但我只是把它投了赞成票,选择了“最老的”正确答案作为被接受的答案answer@MRefaat那很好。你接受的那个在风格上也有点简洁,因为它增加了易读性。他说这仍然只是给最后的循环迭代分配了单击,但考虑到他也不喜欢我的答案,我认为你的答案是正确的,他在代码的其他地方有一个逻辑错误。@GregEnnis最有可能l.getChildAt(0)
可能一直都是同一件事。你的观点也是对的,但我只是把它投了赞成票,选择了“最老的”正确答案作为被接受的答案answer@MRefaat那很好。你接受的那一个在风格上也比较干净,因为它增加了易读性