不能在不同方法中定义的内部类中引用非final变量l

时间:2014-01-12 13:55:32

标签: android iteration onclicklistener

我正在尝试为我的Android应用中的某些元素设置OnClickListener,这些元素是动态定义的,并没有给出id,但是它们放在LinearLayouts中它存在于List 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);
                }
            });
        }

但是我在l标题中提到了语法错误,我不能将其声明为final因为它只将更改分配给{{1}中的最后一个元素}。

3 个答案:

答案 0 :(得分:4)

分成单独的方法:

    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);
        }
    });
}

答案 1 :(得分:3)

您还可以创建自己的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));
}

答案 2 :(得分:1)

您可以将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);
            }
        });
    }

中解释了为什么for(final Type name : Iterable)有效

How does "final int i" work inside of a Java for loop?