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

问题描述 投票:1回答:3

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

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;

                }
            });
        }


    }


}
android
3个回答
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;

        }
    });
}

0
投票

您收到此错误是因为如果类不是最终的,则无法从其内部类访问类的变量

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

有关详细解释,请参阅this article


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;

            }
        });
    }

但它会在checkd和unchecked的复选框上为mChecked增加价值。

© www.soinside.com 2019 - 2024. All rights reserved.