java - final 局部变量不能赋值,因为它是在封闭类型中定义的?

标签 java android variables

希望能够在最后创建一个变量,该变量具有我最终将在 TextView 中显示的时间和成本值。不过我的整数遇到了问题。

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final int intTime = 30;
    final int intCost = 10;

    CheckBox CP = (CheckBox)findViewById(R.id.checkPepperoni);
    CheckBox CS = (CheckBox)findViewById(R.id.checkSausage);
    CheckBox CB = (CheckBox)findViewById(R.id.checkBacon);
    CheckBox CM = (CheckBox)findViewById(R.id.checkMushroom);

    final ImageView cheese =(ImageView)findViewById(R.id.imgCheese);
    final ImageView pepperoni =(ImageView)findViewById(R.id.imgPepperoni);
    final ImageView sausage =(ImageView)findViewById(R.id.imgSausage);
    final ImageView bacon =(ImageView)findViewById(R.id.imgBacon);
    final ImageView mushroom =(ImageView)findViewById(R.id.imgMushroom);

    final SharedPreferences sharedPref =PreferenceManager.getDefaultSharedPreferences(this);



    CP.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
                        //Pepperoni Listener
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked1) {
            // TODO Auto-generated method stub

                  if(isChecked1){                       

                      pepperoni.setImageResource(R.drawable.pepperoni);
                      intTime = intTime + 6;
                      intCost = intCost + 5;
                    }
                   else{

                        pepperoni.setImageResource(0);
                        intTime = intTime - 6;
                        intCost = intCost - 5;
                   }

    }});

    CS.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
                    //Sausage Listener
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked2) {
            // TODO Auto-generated method stub

                  if(isChecked2){                       

                      sausage.setImageResource(R.drawable.sausage);
                      intTime = intTime + 6;
                      intCost = intCost + 5;

                    }
                   else{

                       sausage.setImageResource(0);
                       intTime = intTime - 6;
                        intCost = intCost - 5;

                   }

    }});

    CB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked3) {
            // TODO Auto-generated method stub

                  if(isChecked3){                       

                      bacon.setImageResource(R.drawable.bacon);
                      intTime = intTime + 6;
                      intCost = intCost + 5;

                    }
                   else{

                       bacon.setImageResource(0);
                       intTime = intTime - 6;
                        intCost = intCost - 5;

                   }

    }});

    CM.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked4) {
            // TODO Auto-generated method stub

                  if(isChecked4){                       

                      mushroom.setImageResource(R.drawable.mushroom);
                      intTime = intTime + 6;
                      intCost = intCost + 5;

                    }
                   else{

                       mushroom.setImageResource(0);
                       intTime = intTime - 6;
                        intCost = intCost - 5;

                   }

    }});


    ImageButton IB = (ImageButton)findViewById(R.id.imgBtnGo);
    IB.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String time = Integer.toString(intTime);
            String cost = Integer.toString(intCost);

            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putString("keyTime", time);
            editor.putString("keyCost", cost);

            startActivity(new Intent(MainActivity.this, ResultActivity.class));

        }

    });
}

}

我遇到的错误是“无法分配最终局部变量 intCost,因为它是在封闭类型中定义的。”

这是什么意思,有什么方法可以使用所有复选框来更改此变量?

最佳答案

问题的原因是final变量在声明时就应该初始化,不能重新赋值。对于这种情况,最好的办法是在匿名类中创建以最终变量值开头的内部字段,并且该内部字段会定期更新。

例子:

CP.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    //Pepperoni Listener
    int innerTime = intTime;
    int innerCost = intCost;

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked1) {
        if(isChecked1) {
            pepperoni.setImageResource(R.drawable.pepperoni);
            innerTime += 6;
            innerCost += 5;
        } else {
            pepperoni.setImageResource(0);
            innerTime -= 6;
            innerCost -= 5;
        }
    }
});

更多信息:

关于java - final 局部变量不能赋值,因为它是在封闭类型中定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30176123/

相关文章:

java - 如何获取证书中的子根证书?

android - 观看动画不会改变触摸区域

c gobjects.h 通过变量将颜色值传递给 setColor

java - 如何在 .txt 文件中存储字符串,同时不清除该文件中已有的内容 java

bash - 如何使用 sed 从文件中打印行,其中行号存储为变量

JavaFx 不会改变场景

java - 为什么Java中的equals()必须传递Object作为参数?

java - 无法再次创建相同的文件

android - 通过 Gmail 发送带有自定义方案的链接

android - 在对话框 fragment 中方向改变目标 fragment 改变后