无法访问内部类中的变量:Android Studio

时间:2018-12-13 16:21:18

标签: android

我的项目的目标是分配代表复选框的数字,该复选框已签入空数组。

int [] mChecked = new int []{};

当我尝试无法访问内部类中的变量时,我试图制作一个单击复选框号的循环,并将mCheked数组分配给新值,该数字与复选框号相对应。在android studio中,您必须创建新变量final int FinalI = i;来跟踪代码,但是如果最终变量不能重新分配值。

这是代码中出错的部分。

 for(int i=0 ; i < arrayCheck.length ; i++)
    {

        arrayCheck[i].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

               mChecked[i] = i+1;

            }
        });
    }

尤其是在这一行

mChecked[i] = i+1;

image of error part

这是完整的代码

  package com.okssaami.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;

public class MainActivity extends AppCompatActivity {

    CheckBox G1, G2, G3, G4, G5, G6, G7, G8, G9, G10, G11, G12, G13, G14, G15,
            G16, G17, G18, G19, G20, G21, G22, G23, G24, G25, G26, G27, G28, G29, G30,
            G31, G32, G33, G34;
    Button Submit;

    int [] mChecked = new int []{};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        int [] ids = new int [] {
                R.id.G1,
                R.id.G2,
                R.id.G3,
                R.id.G4,
                R.id.G5,
                R.id.G6,
                R.id.G7,
                R.id.G8,
                R.id.G9,
                R.id.G10,
                R.id.G11,
                R.id.G12,
                R.id.G13,
                R.id.G14,
                R.id.G15,
                R.id.G16,
                R.id.G17,
                R.id.G18,
                R.id.G19,
                R.id.G20,
                R.id.G21,
                R.id.G22,
                R.id.G23,
                R.id.G24,
                R.id.G25,
                R.id.G26,
                R.id.G27,
                R.id.G28,
                R.id.G29,
                R.id.G30,
                R.id.G31,
                R.id.G32,
                R.id.G33,
                R.id.G34
        };

        final CheckBox [] arrayCheck = new CheckBox[ids.length];

        for(int i=0 ; i < arrayCheck.length ; i++)
        {
            arrayCheck[i] = (CheckBox) findViewById(ids[i]);
        }

        for(int i=0 ; i < arrayCheck.length ; i++)
        {

            arrayCheck[i].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                   mChecked[i] = i+1;

                }
            });
        }


    }


}

3 个答案:

答案 0 :(得分:0)

这是在堆栈上声明变量i的结果,然后在将堆栈放入内部类之后尝试使用它(编译器会识别出该情况并告诉您使用最终变量,因此它可以在内部类中使用它)。要确切地了解您在做什么错,可以看一下article

尝试一下:

for(int i=0 ; i < arrayCheck.length ; i++)
{
    final int value = i;
    arrayCheck[i].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

           mChecked[value] = value+1;

        }
    });
}

答案 1 :(得分:0)

您收到此错误是因为您不能从其内部类访问类的变量(如果不是最终变量的话)

  

本地类绝对可以引用实例变量。它们之所以不能引用非最终局部变量,是因为该方法返回后,局部类实例可以保留在内存中。当该方法返回时,局部变量超出范围,因此需要它们的副本。如果变量不是最终变量,则该方法中变量的副本可能会更改,而本地类中的副本不会更改,因此它们将不同步。

有关原因,请参见this article

答案 2 :(得分:0)

可以这样做:

 for(int i=0 ; i < arrayCheck.length ; i++)
    {
        arrayCheck[i].setTag(i);
        arrayCheck[i].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
              int position= Integer.parseInt(buttonView.getTag().toString());
              mChecked[position] = position+1;

            }
        });
    }

,但它将在选中和未选中复选框的情况下为mChecked增值。